将表单添加到现有的Qt应用程序

时间:2015-01-29 08:11:56

标签: c++ qt bitcoin

请原谅这个模糊的标题。我实际上尝试的是基于比特币代码向Cryptocurrency钱包添加另一个选项卡,但我对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()));

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

怎么了?

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

  • 逻辑Radio.h):描述该类的头文件。

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

在您的情况下,我认为您的Radio课程应为QWidget。这意味着在Radio.h中你至少会有一个明确定义的构造函数来分配父窗口小部件。此外,在Radio.cpp中,您会调用setupUi来链接班级和用户界面(来自UI_Radio.h)。

这就是你应该做的:

enter image description here

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

enter image description here

  

所以你的问题是:你甚至没有实现Radio类   你应该把它变成一个有效的小部件。

查看您的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已经无法实例化。此外,它根本不是一个有效的小部件。因此,这两位主持人失败了,理所当然。

第785行

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

connect功能仅适用于QObject QWidget继承的radioPage。毫无疑问,您{{1}}再次失败了。