从另一个 std::thread 调用 Qt 对象方法
Call Qt object method from another std::thread
我有一个简单的Qt形式,它代表我的应用程序的主窗口。它有方法:
void gui_popup::on_pushButton_clicked()
{
QString text = ui->MainText->toPlainText();
text = "1n" + text;
ui->MainText->setText(text);
}
我也有一些代码,在另一个线程中运行,创建如下:
std:thread* core_thread = new thread(&Init); //void Init()...
然后,在某个时刻或条件代码需要调用 gui_popup::on_pushButton_clicked()。我正在尝试这样做:
void test_callback(void* object_ptr)
{
auto this_object = (gui_popup*)object_ptr;
this_object->on_pushButton_clicked();
}
在 std::thread 代码中test_callback我保存了指针和gui_popup对象指针。但是当它开始调用on_pushButton_clicked()程序时,会因分段错误而停止。此代码适用于其他一些简单类,但不适用于 QtObject。我做错了什么?
更新:我是这样解决的:
void test_callback(void* object_ptr)
{
QMetaObject qtmo;
qtmo.invokeMethod((gui_popup*)object_ptr, "on_pushButton_clicked");
}
当然,它比使用 QThread、发射信号和所有其他建议的解决方案要复杂得多。但是,谢谢大家的帮助。
我通常这样解决:
class Foo : public QObject
{
Q_OBJECT
Foo()
{
// connect to own signal to own slot and hence "translate" it
connect(this, SIGNAL(some_signal(QString)),
this, SLOT(some_slot(QString)));
}
signals:
void some_signal(QString s);
protected slots:
void some_slot(QString s)
{
// do something with your gui
}
public:
void callback_proxy(std::string s)
{
emit some_signal(QString::fromUtf8(m_string.c_str()));
}
};
然后胎面不需要知道 QT:
void thread_run_function(Foo* foo)
{
foo->callback_proxy("Hello from Thread!");
}
据我了解,这是保存的,因为连接(信号,插槽)确实有一个额外的默认参数(默认为 Qt::AutoConnection
的Qt::ConnectionType
类型)。这会告诉 QT 将不同的信号分散到 qt 主事件循环中,如果它们来自外部线程。请注意,使用此连接类型 essentialy 会使 qt 在运行时决定是调度信号还是立即调用时隙。
马丁
编辑:有关默认参数和此链接的更多信息作为参考:见 http://doc.qt.io/qt-5/qt.html#ConnectionType-enum
相关文章:
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 如何注册Qt C++对象以在QML中使用它
- Qt对象所有权内存泄漏
- 以延长构造函数外部 QT 对象的生存期
- 我有一个 Qt 对象的 2d 数组,我已经用值播种了这些对象。如何访问数组中特定对象的值并更改它们?
- Qt对象如果使用'this'创建(更新)需要删除或自动删除?
- 在 cmake 中链接 Qt 对象
- 将流运算符添加到 Qt 对象
- 在 QT 对象类中声明 PCL 点云
- QT对象::连接:没有此类插槽信号到线程插槽
- 如何在调试期间查看Qt对象QByteArray的内容
- Qt对象删除导致崩溃
- 如何从线程的结果返回Qt对象(Qtfutur)
- QtWebkit javascript bridge,无法访问 Qt 对象方法
- 将 Qt 对象与 std::shared_ptr 一起使用
- 带有 Qt 对象的 Cmake 库
- 向QML公开复杂的Qt对象C++
- 从另一个 std::thread 调用 Qt 对象方法
- Qt 对象实例化查询
- C++中的静态成员Qt对象