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

Adding a form to pre existing Qt application

请原谅模糊的标题。我实际上正在尝试的是向基于比特币代码的加密货币钱包添加另一个选项卡,但我对 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):描述 class.

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

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

所以这是你应该做的:

但这就是你所做的(你在这里使用了名字Radio.h,但没关系):

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 设计器无法为您构建整个小部件。它只是帮助您创建小部件的布局,您仍然需要实现小部件的逻辑部分。

我建议您看一下 overviewPage 以了解在将小部件添加到主 window.

之前应该如何实现它

错误说明

你的问题台词:

第 119 行

radioPage = new Ui_Radio(this);

this指向BitcoinGUI,这是一个widget。您未能在此处实例化 Radio class。

第 129 和 781 行

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

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

第 785 行

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

connect 函数仅适用于 QObjectQWidget 继承自该函数。毫无疑问,你的 radioPage 又失败了。