码迷,mamicode.com
首页 > 编程语言 > 详细

Qt 子线程更新Ui

时间:2019-11-02 14:06:56      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:sig   定时   strong   text   demo   连接   slot   inf   oid   

最近做练习,写一个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

标签:sig   定时   strong   text   demo   连接   slot   inf   oid   

原文地址:https://www.cnblogs.com/duxie/p/11781243.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!