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));
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM