在已经运行的QThread上调用函数

问题描述

我已经在Internet(和Qt文档)上看到了许多使用QThread的示例,该类是该类的子类,然后将一个工作对象移至该线程。然后,实际上QThread::started()信号被连接到worker类对象的某个插槽以运行某个功能。 现在,我想在项目中执行相同的操作,不同之处在于,我想将worker类移动到已经运行的线程中,然后在该线程上调用一些函数。为了实现这一目标,我想出了一点类似于以下代码的技巧,其中我使用QTimer类在我的worker类中调用一个公共插槽。

    QThread myThread;
    myThread.setobjectName("myThread");
    myThread.start();

    Worker worker;
    worker.movetoThread(&myThread);

    QTimer::singleShot(0,&worker,[&worker](){
        worker.doStuff(5);
    });

是否有更惯用的方式实现同​​一件事?

解决方法

如果“ doStuff”是一个插槽,则可以使用QMetaObject :: invokeMethod:

QMetaObject::invokeMethod(&worker,"doStuff",Qt::QueuedConnection,Q_ARG(int,5));