2017-06-14 130 views
1

我试图将信号从一个QObject连接到作为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(&)())' 

工作者继承自QObject,并且在它的Q_OBJECT关键字。事实上,这种方法没有问题的线路也消除了其他线路成为问题。

任何想法,我在做什么错?在我看来,它应该是这个直截了当的。

如果相关,QT版本是5.8,GCC版本是4.8.5。

谢谢!

+5

不是你的问题的答案,只是一个评论:你为什么不使用新的编译时检查'连接'语法?你正在使用一个足够新的Qt,它是可用的。摆脱丑陋的'SIGNAL'和'SLOT'宏,会给你编译时错误,而不是无法建立连接时的运行时错误。 –

+1

@JesperJuhl其实我认为这就是答案。查看文档,使用函子的'connect()'静态函数没有支持旧信号/插槽语法的版本。 – MrEricSir

+0

@MrEricSir我会提交它作为答案,然后我们会看到它是如何判断;) –

回答

2

这是正确的,没有办法使用基于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 1part 2以了解更多详细信息。另请参见here两种方法的详细并行概要。

2

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

+0

这个答案也是正确的,基本上与我接受的答案相同。无论如何,我将从现在开始转向新的语法,因为它似乎要优于旧的语法。谢谢! –