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,它是可用的。将摆脱丑陋的 SIGNALSLOT 宏,并在无法建立连接时给您编译时错误而不是运行时错误。 @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,它是可用的。将摆脱丑陋的 SIGNALSLOT 宏,并在无法建立连接时为您提供编译时错误而不是运行时错误,这也适用于 lambda 和成员函数以及大多数其他可调用对象。

【讨论】:

这个答案也是正确的,和我接受的答案基本一致。从现在开始,我将切换到新语法,因为无论如何它似乎都优于旧语法。谢谢!

以上是关于connect(QObject*, SIGNAL(signal()), functor) 未在 qt5 中连接的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5信号-槽机制

Qt:创建一个 QDoubleSlider

C++ GUI Qt的建立连接,信号和槽

QT 用比 SLOT 更少的参数连接一个 SIGNAL

QT多线程操作

qt杂项