请原谅这个模糊的标题。我实际上尝试的是基于比特币代码向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()));
有什么想法吗?
答案 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
)。
这就是你应该做的:
但这就是你做过的事情(你在这里使用了名字Radio.h
,但没关系):
所以你的问题是:你甚至没有实现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}}再次失败了。