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编程里面的事件通知,当线程完成后发送一个信号给主线程,并利用主线程中的槽函数更改按钮状态。