我正在尝试将QObject中的信号连接到QT5文档中定义的仿函数:
http://doc.qt.io/qt-5/qobject.html#connect-5
相关代码:
$(document).ready(function() {
var group_list = "json/google_group_list.json";
$.getJSON(group_list, function(json) {
$.each(json, function(key) {
var email_stripped = json[key].substring(0, json[key].lastIndexOf("@"));
$('select[id=group-select-user-access]').append('<option value="' + email_stripped + '">' + json[key] + '</option>');
});
});
})
如果我只是注释掉那些不编译的行,那么这段代码会编译并执行,没有任何问题。我只是无法获得编译的连接。
编译器错误:
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();
}
}
当然Worker继承了QObject并且其中包含Q_OBJECT关键字。事实上,这没有问题的线也可以消除其他线是问题。
关于我做错什么的任何想法?在我看来,这应该是直截了当的。
如果相关,QT版本为5.8,GCC版本为4.8.5。
谢谢!
答案 0 :(得分: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 1和part 2。另请参阅两种方法here的详细并列纲要。
答案 1 :(得分:2)
使用新的编译时检查的连接语法。您正在使用足够新的Qt,它可用。将摆脱丑陋的SIGNAL
和SLOT
宏,并且会在无法建立连接时给出编译时错误而不是运行时错误,这将适用于lambda和成员函数以及大多数其他callables同样。