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

时间:2017-06-14 21:20:32

标签: c++ qt functor qt-signals

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

谢谢!

2 个答案:

答案 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 1part 2。另请参阅两种方法here的详细并列纲要。

答案 1 :(得分:2)

使用新的编译时检查的连接语法。您正在使用足够新的Qt,它可用。将摆脱丑陋的SIGNALSLOT宏,并且会在无法建立连接时给出编译时错误而不是运行时错误,这将适用于lambda和成员函数以及大多数其他callables同样。