Qt moc_mainwindow
Posted
技术标签:
【中文标题】Qt moc_mainwindow【英文标题】: 【发布时间】:2017-03-28 16:54:52 【问题描述】:我正在开发一个应用程序(使用 OpenCV),我在其中创建了一个滚动条和相关功能,但最后我删除了滚动条。出现以下错误:
moc_mainwindow.cpp:-1: erreur : 未定义对 MainWindow::on_verticalScrollBar_actionTriggered(int)' 的引用
moc_mainwindow.cpp:-1: erreur : 未定义对 MainWindow::on_verticalScrollBar_sliderPressed()' 的引用
:-1: erreur : release/moc_mainwindow.o: `.data' 部分中的错误重定位地址 0x4
collect2.exe:-1: erreur : error: ld 返回 1 退出状态
感谢您的帮助
【问题讨论】:
请阅读如何做一个minimal reproducible example 在 Build 选项卡上按 Clean all 然后运行 Qmake @eyllanesc 我已经清理了项目,但错误仍然存在。但是,当我创建与“缺失”的函数相对应的空函数时,代码当然会运行,但它当然不是最佳代码 根据 cmets 听起来好像您已经声明了插槽MainWindow::on_verticalScrollBar_actionTriggered
和 MainWindow::on_verticalScrollBar_sliderPressed
但尚未定义/实现它们。
@G.M.是的,你是对的,但问题是我从界面中删除了滚动条,但 Qt 显示了一个关于函数的错误,该函数尚不存在,这就是问题所在......
【参考方案1】:
错误undefined reference to `MainWindow::...'
是由于您在mainwindow.h
中声明了函数但未在任何地方定义。
要解决这个问题,要么在mainwindow.cpp
中定义它们,要么从mainwindow.h
中删除它们的声明。如果你显然没有使用它们,你应该删除它们。
现在关于“Qt 显示一个关于尚不存在的函数的错误” 你可能指的是QMetaObject::connectSlotsByName: No matching signal for ...
。
如果您有一个或多个名为on_<objectName>_<signalName>
的插槽(例如on_verticalScrollBar_sliderPressed
和on_verticalScrollBar_sliderPressed
)但对象objectName
不存在或存在但没有名为signalName
的信号,则可能会发生这种情况。
这是由QMetaObject::connectSlotsByName() 引起的,它在对ui->setupUi()
的调用中被调用。此函数将尝试连接与on_<objectName>_<signalName>
语法匹配的每个插槽,并在失败时将警告写入stderr
(或调试输出)。
另外我强烈建议您不要使用QMetaObject::connectSlotsByName()
和on_<objectName>_<signalName>
语法。如果您使用 .ui 文件,则无法阻止对 QMetaObject::connectSlotsByName()
的调用,因为它在生成的代码中,但如果您不使用语法,它将无效。
相反,您应该在代码中显式连接信号和插槽。
见:
[QTBUG-49749] connectSlotsByName() misconnects slots when multiple children have the same name "Proposal to change connectSlotsByName behavior" in Qt developer mailing list【讨论】:
以上是关于Qt moc_mainwindow的主要内容,如果未能解决你的问题,请参考以下文章