我想在它自己的线程中调用对象的插槽。换句话说,将槽处理放入接收者的线程队列中。
据我所知,这可以通过使用来完成
QMetaObject::invokeMethod(objPtr, "someMethod", Qt:: QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
但对于我来说,这种方式是不安全的。因为没有任何关于具有此类名称的方法是否存在的编译时检查。如果出现某些错误,错误只会在运行时和日志中发生。
另一种方法是创建虚拟信号,例如
void callObj();
Run Code Online (Sandbox Code Playgroud)
并将这个虚拟信号连接到插槽
connect(this, &Obj1::callObj, objPtr, &Obj2::someMethod, Qt:: QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
但这种方式看起来真的很糟糕。
那么有什么办法可以做到这一点吗?
预先感谢您的帮助。
如果您定义了要调用的接口,则可以使用QTimer
0 毫秒超时的单次调用:
QTimer::singleShot(0, obj, &Class::slot);
Run Code Online (Sandbox Code Playgroud)
你也可以用 lambda 来调用它
QTimer::singleShot(0, obj, [obj]{ obj->slot(42); } );
Run Code Online (Sandbox Code Playgroud)
这种方法要求目标线程运行它自己的事件循环(即QThread::exec()
),但由于您想在其线程中运行插槽,我认为这就是您想要的。