c++ - 向现有 Qt 应用程序添加表单

标签 c++ qt bitcoin

请原谅模糊的标题。我实际上正在尝试的是向基于比特币代码的加密货币钱包添加另一个选项卡,但我对 Qt 有点陌生,我遇到了一个我无法修复的错误。

我在 Qt Designer 中创建了表单并使用 uic 将其转换为 .h 文件并在 bitcoingui.cpp/.h 和 Project.pro 文件中引用了它。

生成的 .h 可以在这里找到:radio.h

bitcoingui.cpp 在这里:bitcoingui.cpp

bitcoingui.h 在这里:bitcoingui.h

有问题的错误是:

src/qt/bitcoingui.cpp: In constructor ‘BitcoinGUI::BitcoinGUI(QWidget*)’:
src/qt/bitcoingui.cpp:119: error: no matching function for call to ‘Ui_Radio::Ui_Radio(BitcoinGUI* const)’
src/qt/radio.h:15: note: candidates are: Ui_Radio::Ui_Radio()
src/qt/radio.h:15: note:                 Ui_Radio::Ui_Radio(const Ui_Radio&)

src/qt/bitcoingui.cpp:129: error: no matching function for call to ‘QStackedWidget::addWidget(Ui_Radio*&)’
/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers/qstackedwidget.h:67: note: candidates are: int QStackedWidget::addWidget(QWidget*)

src/qt/bitcoingui.cpp: In member function ‘void BitcoinGUI::gotoRadioPage()’:
src/qt/bitcoingui.cpp:781: error: no matching function for call to ‘QStackedWidget::setCurrentWidget(Ui_Radio*&)’
/opt/local/Library/Frameworks/QtGui.framework/Versions/4/Headers/qstackedwidget.h:80: note: candidates are: void QStackedWidget::setCurrentWidget(QWidget*)
src/qt/bitcoingui.cpp:785: error: no matching function for call to ‘BitcoinGUI::connect(QAction*&, const char [13], Ui_Radio*&, const char [17])’
/opt/local/include/QtCore/qobject.h:215: note: candidates are: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/opt/local/include/QtCore/qobject.h:229: note:                 static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/opt/local/include/QtCore/qobject.h:338: note:                 bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
make: *** [build/bitcoingui.o] Error 1

这告诉我 bitcoingui.cpp 中的第 119、129、781 和 785 行存在问题

有问题的行是:

radioPage = new Ui_Radio(this);
centralWidget->addWidget(radioPage);
centralWidget->setCurrentWidget(radioPage);
connect(exportAction, SIGNAL(triggered()), radioPage, SLOT(exportClicked()));

有什么想法吗?

最佳答案

怎么了?

Qt中一个有效的Widget包含两部分:

  • Logic (Radio.h):描述类的头文件。

  • UI (UI_Radio.h):由 UIC 从 .ui 生成。通常,Qt 的UIC 使用前缀UI_ 来表示与另一个头文件的区别。这个头文件只是定义了一个方便管理UI组件的类,它本身并不是一个widget,只是一个普通的C++类。

在您的情况下,我认为您的Radio 类应该是QWidget。这意味着在 Radio.h 中,您将至少有一个显式定义的构造函数来分配父窗口小部件。此外,在 Radio.cpp 中,您将调用 setupUi 来链接类和 UI(来自 UI_Radio.h)。

所以这是你应该做的:

enter image description here

但这就是你所做的(你在这里使用了名称Radio.h,但这并不重要):

enter image description here

So your problem is: You didn't even implement the Radio class, while you should've made it a valid widget.

看看你的Radio.h文件(通常命名为 UI_Radio.h),没有明确定义任何构造函数。这就是您收到此错误的原因:

src/qt/bitcoingui.cpp: In constructor ‘BitcoinGUI::BitcoinGUI(QWidget*)’:
src/qt/bitcoingui.cpp:119: error: no matching function for call to ‘Ui_Radio::Ui_Radio(BitcoinGUI* const)’

Qt Designer 无法为您构建整个小部件。它只是帮助您创建小部件的布局,您仍然需要实现小部件的逻辑部分。

我建议您查看 overviewPage 以了解在将小部件添加到主窗口之前应如何实现它。


错误说明

你的问题台词:

第119行

radioPage = new Ui_Radio(this);

this 指向 BitcoinGUI,这是一个小部件。您未能在此处实例化您的 Radio 类。

第 129 和 781 行

centralWidget->addWidget(radioPage);
centralWidget->setCurrentWidget(radioPage);

您的 radioPage 实例化失败。此外,它甚至根本不是一个有效的小部件。所以这两个setter都失败了,这是理所当然的。

第 785 行

connect(exportAction, SIGNAL(triggered()), radioPage, SLOT(exportClicked()));

connect 函数仅适用于 QObjectQWidget 继承自该对象。毫无疑问,您的 radioPage 在这里又失败了。

关于c++ - 向现有 Qt 应用程序添加表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209825/

相关文章:

c++ - std::vector 线程对我来说是安全的吗?

c++ - VS2012 中的 is_directory() 对于偶数目录返回 false

c++ - 在Windows上使用Qt和opencv构建问题

c++ - 包含<stdio.h>的实验导致了令人讨厌的Qt问题

python - 计算丢失的比特币私钥的校验和比特币

bitcoin - 编译智能合约而不删除换行符

c++ - 在 Linux 上交叉编译 Windows 应用程序时如何链接到 Winsock?

c++ - 覆盖方法时访问说明符

c++ - Raspberry Pi 3 上的 QML 性能

transactions - 智能合约和交易有什么区别?