c – QMetaObject :: invokeMethod返回true,但从不调用方法

我正在尝试使用QMetaObject :: invokeMethod在GUI线程上运行一个方法,该方法返回true.但是,如果我使用Qt :: QueuedConnection,我的方法永远不会被调用(即使invokeMethod返回true).

这就是我正在使用的:

QMetaObject::invokeMethod(this,"draw_widgets",Qt::QueuedConnection)

我没有得到任何错误消息或任何东西……
如果我使用Qt :: AutoConnection或Qt :: DirectConnection,该方法会被调用,但当然是从同一个线程调用.不是来自GUI线程,这是我需要的.

draw_widgets是void draw_widgets()类型的公共插槽
我的类继承了QObject并使用了Q_OBJECT宏.

我将不胜感激任何帮助,或如何检查为什么不调用方法.

谢谢.

解决方法

“true”告诉您邮件已成功排队.这并不意味着排队的消息曾被处理过……

让我们说你的程序有10个线程(Thread1-Thread10).您从Thread7排队消息.它将排队到哪个线程?何时处理此队列中的项目?

答案是每个QObject都有一个叫做Thread Affinity的东西,这就是运行排队槽的线程.认亲缘关系是创建对象的线程(但您可以使用QObject::moveToThread()更改它).

如果要将某些内容排入GUI线程,则此指针指定的对象应具有GUI线程的亲和性.您可以使用QObject::thread()方法进行检查.

但无论如何,无论你排队什么线程……你必须在该线程上运行某种消息泵.例如,请查看QThread::exec().如果您的线程关联是GUI,那么可能已经是这种情况,因为您正在运行应用程序的exec.

(作为旁注,通常不需要直接调用QMetaObject :: invokeMethod.您可以创建一个信号并将其绑定到一个插槽,然后发出信号代替调用.)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...