C++ 向预先存在的Qt应用程序添加表单

C++ 向预先存在的Qt应用程序添加表单,c++,qt,bitcoin,C++,Qt,Bitcoin,请原谅这个模糊的标题。我实际上尝试的是在基于比特币代码的加密货币钱包中添加另一个标签,但我对Qt有点陌生,遇到了一个无法修复的错误 我在Qt Designer中创建了表单,并使用uic将其转换为.h文件,并在bitcoingui.cpp/.h和Project.pro文件中引用了该表单 生成的.h可在此处找到: bitcoingui.cpp此处: bitcoingui.h,请点击此处: 有问题的错误是: src/qt/bitcoingui.cpp: In constructor ‘BitcoinG

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

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

生成的.h可在此处找到:

bitcoingui.cpp此处:

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中的有效小部件包含两个部分:

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

  • UI
    UI\u Radio.h
    ):由UIC从
    .UI
    生成。通常,Qt的UIC使用prefix
    UI
    表示与另一个头文件的差异。这个头文件只是定义一个类来方便地管理UI组件,它不是一个小部件本身,只是一个普通C++类。p>
在你的情况下,我认为你的
收音机
类应该是
QWidget
。这意味着在
Radio.h
中,您至少会有一个明确定义的构造函数来分配父窗口小部件。此外,在
Radio.cpp
中,您将调用
setupUi
链接类和UI(从
UI\u Radio.h

所以这就是你应该做的:

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

因此,您的问题是:您甚至没有实现Radio类,而 你应该让它成为一个有效的小部件

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

我建议您查看一下
概览页面
,了解小部件在添加到主窗口之前应该如何实现


错误解释 您的问题行:

第119行

radioPage = new Ui_Radio(this);
指向
BitcoinGUI
,它是一个小部件。您未能在此处实例化您的
Radio

第129行和第781行

centralWidget->addWidget(radioPage);
centralWidget->setCurrentWidget(radioPage);
您的
radioPage
已无法实例化。此外,它甚至不是一个有效的小部件。因此,这两位二传手失败了,这是理所当然的

第785行

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

connect
功能仅适用于
QObject
,它继承自。毫无疑问,您的
radioPage
再次失败。

嘿,好吧,所以我设法将其实现为一个小部件,并使用webView加载了我想要的网页。有问题的网页是一个我似乎无法播放的互联网广播页面。音频流在示例Qt浏览器中工作,因此我知道这是可能的,但我不知道如何实现音频。你有什么建议吗?再次感谢@MystPhysX如果您还有其他问题,请随时单击
问问题
并开始新的帖子。这个问题被认为已经解决,你很难在这里留下评论来得到进一步的关注。我建议你问一个新问题,毕竟这是StackOverflow是如何工作的。我会的。非常感谢你。