connect(QObject*, SIGNAL(signal()), functor) 未在 qt5 中连接
Posted
技术标签:
【中文标题】connect(QObject*, SIGNAL(signal()), functor) 未在 qt5 中连接【英文标题】:connect(QObject*, SIGNAL(signal()), functor) not connecting in qt5 【发布时间】:2017-06-14 21:20:32 【问题描述】:我正在尝试将来自 QObject 的信号连接到 QT5 文档中定义的函子:
http://doc.qt.io/qt-5/qobject.html#connect-5
相关代码:
namespace someNamespace
void processFinished()
qDebug() << "A Thread has finished processing!!!";
void executeWorkerOnSeparateTread()
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
QObject::connect(worker, SIGNAL(finished()), processFinished); //DOES NOT COMPILE
thread->start();
如果我只注释掉不编译的行,这段代码编译并执行没有问题。我就是无法编译该连接。
编译器错误:
no matching function for call to 'QObject::connect(Worker*&, const char*, void(&)())'
当然 Worker 继承了 QObject 并在其中包含 Q_OBJECT 关键字。事实上,这在没有问题的行的情况下也能工作,这也消除了其他行的问题。
关于我做错了什么有什么想法吗?在我看来,它应该如此简单。
如果相关,QT 版本是 5.8,GCC 版本是 4.8.5。
谢谢!!
【问题讨论】:
不是你的问题的答案,只是一个评论:你为什么不使用新的编译时检查connect
语法?您正在使用一个足够新的 Qt,它是可用的。将摆脱丑陋的 SIGNAL
和 SLOT
宏,并在无法建立连接时给您编译时错误而不是运行时错误。
@JesperJuhl 其实我认为是的答案。查看文档,采用仿函数的 connect()
静态函数没有支持旧信号/插槽语法的版本。
@MrEricSir 我会把它作为答案提交,然后我们会看看它是如何判断的;)
【参考方案1】:
没错,没有办法使用基于moc
的信号和槽连接到命名空间或lambda 中的函数。查看the list of overloads for QObject::connect()` 以了解错误报告的原因。此处使用的正确函数是connect overload for a functor,它使用指向成员函数的指针作为其第一个参数:
QMetaObject::Connection
QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
因此,使用:
QObject::connect(worker, &Worker::finished, processFinished);
请注意函数名称后面缺少圆括号 - 以前不小心让我有些头疼。
这也意味着为了统一起见,您可能希望切换到新语法。
有关更多详细信息,请参阅新信号和槽语法的作者 Olivier Goffart 的博文系列的 part 1 和 part 2。另请参阅here 两种方法的详细并排概要。
【讨论】:
【参考方案2】:使用新的编译时检查连接语法。您正在使用一个足够新的 Qt,它是可用的。将摆脱丑陋的 SIGNAL
和 SLOT
宏,并在无法建立连接时为您提供编译时错误而不是运行时错误,这也适用于 lambda 和成员函数以及大多数其他可调用对象。
【讨论】:
这个答案也是正确的,和我接受的答案基本一致。从现在开始,我将切换到新语法,因为无论如何它似乎都优于旧语法。谢谢!以上是关于connect(QObject*, SIGNAL(signal()), functor) 未在 qt5 中连接的主要内容,如果未能解决你的问题,请参考以下文章