connect(QObject*, SIGNAL(signal()), functor) 在 qt5 中没有连接

connect(QObject*, SIGNAL(signal()), functor) not connecting in qt5

我正在尝试将信号从 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。

谢谢!!

没错,无法使用基于 moc 的信号和槽连接到命名空间或 lambda 中的函数。看看 the list of overloads for QObject::connect()` to see why the error is reported the way it is. The correct function to use here is connect overload for a functor ,它使用一个指向成员函数的指针作为它的第一个参数:

QMetaObject::Connection
QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

因此,使用:

QObject::connect(worker, &Worker::finished, processFinished);

请注意函数名称后缺少圆括号 - 粗心大意让我在过去的日子里头疼不已。

这也意味着您可能希望为了统一起见而切换到新语法。

参考part 1 and part 2 of the blog post series by Olivier Goffart, the author of the new signal and slot syntax, for more details. Also see a detailed side-by-side rundown of the two approaches here.

使用新的编译时检查连接语法。您正在使用足够新的可用 Qt。将摆脱丑陋的 SIGNALSLOT 宏,并在无法建立连接时给您编译时错误而不是 运行 时间错误,这将与 lambda 和成员函数一起使用以及大多数其他可调用对象。