Qt 子线程更新Ui
Posted duxie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 子线程更新Ui相关的知识,希望对你有一定的参考价值。
最近做练习,写一个Qt版的飞机大战,需要用子线程更新UI,发现Qt子线程不能更新Ui,否则程序会崩溃。在网上百度了下,说是需要在子线程自定义信号,然后在线程回调的run()函数里发射信号,主线程连接信号和槽,然后在槽函数里面更新UI。虽然最后发现这个办法对我写飞机大战没有啥帮助,但是感觉这个办法还是需要总结下来的。(最后我是用的定时器更新的UI界面)
废话不多说,下面是子线程更新UI的方法:
第一步:写一个线程类,继承自QThread
第二步:自定义信号
class CMyThread : public QThread { Q_OBJECT public: CMyThread(QObject *parent, CBullet* bullet); ~CMyThread(); void run(); private: CBullet* m_bullet; signals: // 自定义信号 void Send2UI(CBullet* bullet); };
第三步:在run()函数里面发射信号
void CMyThread::run() { // 发射信号 emit Send2UI(m_bullet); }
第四步:由于Qt的实现机制,在emit时,非Qt类型,需要注册,这样信号才能响应。(一般在主线程构造函数里面注册)
qRegisterMetaType<CBullet*>("bullet");
第五步:创建子线程,连接信号和槽,在槽函数更新Ui
void PlaneGame::on_btnUpdateInfo_clicked() { CMyThread *ch = new CMyThread(); // 连接线程发过来的信号 connect(ch, SIGNAL(Send2UI(Msg)), this, SLOT(ShowInfo(Msg))); // 启动线程 ch->start(); } // 槽函数 void ThreadComuDemo::ShowInfo(Msg msg) { string infostr = "name = " + msg.name + " " + "id = " + to_string(msg.id) + " " + "age = " + to_string(msg.age); ui.lineEdit_StuInfo->setText(QString::fromStdString(infostr)); }
以上是关于Qt 子线程更新Ui的主要内容,如果未能解决你的问题,请参考以下文章