我想调用一个MyWidget
插槽
class MyWidget : public QWidget {
Q_OBJECT
public slots:
void onFooBar(const std::string&);/*std::string& could also be replaced
by a QString for easier meta system handling*/
};
但是因为在我使用boost::asio
的情况下,对于线程,我不想用Qt做任何事情,所以我想从一个不同于主线程的线程调用这个插槽,但是是一个我不能控制的随机线程。(当然,在我允许运行boost::asio
的线程中)
我该怎么做呢?QCoreApplication::postEvent
似乎是一个不错的选择,但文档并没有指出如何创建必要的QEvent
的好方法。带有Qt::QueuedConnection
的QMetaObject::invokeMethod
看起来也不错,但文档中没有说明是线程安全的。
那么,如何安全地从非qt托管线程中调用qt 呢?
(尽管Boost asio with Qt的标题表明这可能是重复的,但对我来说,这个问题似乎完全不同,这个问题不一定与boost::asio
有关)
发布于 2018-12-17 04:55:38
事实证明,带有Qt::QueuedConnection
的QMetaObject::invokeMethod
实际上在其实现中使用了QCoreApplication::postEvent
(感谢@peppe!)。但是,保证它是线程安全的,当
与由Qt管理的接收方的Qt::QueuedConnection
还没有被记录下来。但我已经创建了一个bug report和qt forum讨论,似乎是有意如此,并且已经创建了一个documentation change ticket。
我在最后使用的是通用模式
class MyWidget : public QWidget {
Q_OBJECT
public slots:
void onFooBar(QString);
};
void asio_handler(const std::string& string, MyWidget* my_widget) {
QMetaObject::invokeMethod(
my_widget, "onFooBar", Qt::QueuedConnection,
Q_ARG(QString, QString::fromStdString(string))
);
}
https://stackoverflow.com/questions/53803018
复制相似问题