无法在另一个线程-QT中向对象发送已发布的事件
Cannot send posted events for objects in another thread - Qt
我已经创建了一个 qthread 类来运行另一个类中的函数,但是这另一个类有一个指向 qwidget (qwtplot),我在应用程序输出中收到此消息:
QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread
我已经在另一个主题中阅读了Qthreads与Qwidgets不起作用(UI小部件必须在主线程中),但是我的应用程序中的输出似乎是正确的。
谁能向我解释为什么会出现此消息?如果我让代码原样会发生什么?
注意:对不起,我无法发布代码。
预先感谢
我已经阅读了另一个主题,即Qthreads与qwidgets不起作用[...] 但是我的应用程序中的输出似乎是正确的。
这是不正确的,否则您不会问,对吗?
QWidget
必须在主线程中。而且很可能是。但是,您正在从另一个线程调用其方法,而您调用的方法也不安全。不要那样做。还有其他跨线程安全调用方法的方法。改用它们。例如,假设您希望致电QWidget::resize
,则可以从此答案中使用postToThread
:
QWidget* widget;
QSize size;
Q_ASSERT_X(widget->thread() == qApp->thread(), "widget",
"The widget must live in the main thread.");
postToThread([=]{ widget->resize(size); }, widget);
如果您想变得更详细,或者必须维护QT 4代码库,则可以做到这一点:
class TSWidgetAdapter : public QObject {
Q_OBJECT
QWidget * widget() const { return qobject_cast<QWidget*>(parent()); }
Q_SLOT void resize_d(const QSize & size) { widget()->resize(size); }
public:
explicit TSWidgetAdapter(QWidget * parent) : QObject(parent) {
Q_ASSERT_X(parent->thread() == qApp->thread(), "TSWidgetAdapter()",
"The widget must live in the main thread.");
connect(this, SIGNAL(resize(QSize)), this, SLOT(resize_d(QSize)));
}
Q_SIGNAL void resize(const QSize & size);
};
QWidget* widget;
QSize size;
TSWidgetAdapter widget_ts(widget);
widget_ts.resize(size);
在小部件的线程中调用_d
插槽。这就是自动连接的美丽:您可以在任何线程中调用信号,并且仅在目标对象的线程中调用插槽。由于适配器是小部件的孩子,因此它在小部件的线程中 - 由qt。
相关文章:
- 在事件过滤器之前发出对象的事件
- 对象销毁后的事件
- 如何在OpenGL中使用关键事件来转换对象
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 是否可以在C++(17)中捕获某些对象属性的破坏性赋值事件
- 如何在主事件循环之前创建一些对象?
- QT:QT无法将事件发送到另一个线程拥有的对象 - 原因
- WXWIDGETS将鼠标事件连接到WXPAINTDC上的形状对象以删除
- 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C 构建器]
- 将 ETW 文件对象与 DiskIO 事件相关联
- 是否有任何对象可以用作FIFO和弹出数据的事件
- C++使用 shared_ptr 安全地删除事件对象有效负载
- 将C 对象暴露于QML并收听更改事件
- 无法在另一个线程-QT中向对象发送已发布的事件
- Qt 事件过滤器未检测到对象名称
- Win32获取从窗口WNDProc发送事件的对象的HWND
- 如何设置并发::事件对象,仅当它现在未处于信号状态时
- 我可以在 QP(量子平台)活动对象中等待 Windows 事件(WaitForMultipleObjects)吗?
- 如何调试是否设置了 Windows 事件对象
- 不接受c++类的事件对象