【发布时间】: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 我会把它作为答案提交,然后我们会看看它是如何判断的;)
标签: c++ qt functor qt-signals