• 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));
    }
  • 相关阅读:
    .net core系列之《.net平台历程介绍以及.net framework和.net core对比》
    C++ 拷贝构造函数
    C++ const引用
    C++ 引用和指针
    C++ 将派生类赋值给基类(向上转型)
    C++ 虚继承
    C++ 基类和派生类的构造函数以及析构函数
    C++ 类继承时的作用域嵌套和对象内存模型
    C++ private + protected + public
    C++ const成员变量、成员函数和对象
  • 原文地址:https://www.cnblogs.com/duxie/p/11781243.html
Copyright © 2020-2023  润新知