问题描述
我已经在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));