c++ - 没有连接如何调用slot?

标签 c++ qt

我想在它自己的线程中调用对象的槽。换句话说,就是将槽处理放入接收者的线程队列中。

据我所知,可以通过使用来完成

QMetaObject::invokeMethod(objPtr, "someMethod", Qt:: QueuedConnection);

但是对于我来说,这种方式是不安全的。因为没有任何关于具有此类名称的方法是否存在的编译时检查。如果出现某些错误,错误只会在运行时和日志中发生。

另一种方法是创建虚拟信号,例如

void callObj();

并将这个虚拟信号连接到插槽

connect(this, &Obj1::callObj, objPtr, &Obj2::someMethod, Qt:: QueuedConnection);

但是这种方式看起来真的很糟糕。

那么有什么办法可以做到这一点吗?

提前感谢您的帮助。

最佳答案

如果您定义了要调用的接口(interface),则可以使用具有 0 毫秒超时的单次 QTimer:

QTimer::singleShot(0, obj, &Class::slot);

你也可以用 lambda 来调用它

QTimer::singleShot(0, obj, [obj]{ obj->slot(42); } );

这种方法要求目标线程运行自己的事件循环(即QThread::exec()),但由于您想在其线程中运行插槽,我认为这就是您想要的。

关于c++ - 没有连接如何调用slot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923368/

相关文章:

c++ - 如何使用 call 和 alloca 指令在 llvm 字节码中定位类名?

c++ - 继续运行程序直到用户输入退出

c++ - QTimer 不按建议的时间间隔发出信号

c++ - @class AVPlayerLayer 的预期 unqualified-id

c++ - 如何将 QJsonDocument 保存和加载到文件中?

c++ - fatal error : QtGui/QApplication: No such file or directory|

c++ - Qt C++ 如何在文本编辑的开头获取光标?

c++ - Visual Leak Detector 检测新空白 MFC 项目的泄漏

c++ - 为什么在 C++11 中更改了 std::vector::resize 签名?

c++ - boost:scoped_ptr 到 boost::ptr_vector 而不释放资源