首页 > Qt 线程函数中更改 QPushButton 状态失败

Qt 线程函数中更改 QPushButton 状态失败

Qt环境 主线程(GUI线程)中建立一个新线程(工作线程、负责大量计算),计算完成后在工作线程中更改界面 QPushButton 状态 setEnable(true) 失败,而更改 QPushButton 文字 setText("OK") 成功,建立线程时我已经把类指针(this)作为参数传进工作线程了。请问线程中如何更改按钮状态?

tips:can't send event to objects by a different thread!


Qt的文档中说了 所有的GUI控件都是非线程安全的 所以在子线程中不应该直接 qPushButton->setEnable() 而是应该使用 InvokeMethod函数或者是信号与槽机制(两种方法其实都是利用了Qt的元对象系统)
所以不仅直接setEnable是不正确的 直接setText也是不正确的


还是我自己来回答吧,过去遇到过这个问题,一直没有解决;刚刚在群里问别人,别人提示用信号-槽可以解决。于是在类里面写了信号和槽函数:

signals:
  void sendFinal();  // 发送完成信号

private slots:
  void on_changeStatus();   // 更改按钮状态

并且connect信号和槽

connect(this,SIGNAL(sendFinal()),this,SLOT(on_changeStatus()));

最后在线程函数中emit信号

emit ClassPoint->sendFinal();

完美解决!信号-槽类似于Windows编程里面的事件通知,当线程完成后发送一个信号给主线程,并利用主线程中的槽函数更改按钮状态。

【热门文章】
【热门文章】