qt子线程修改主窗口

该文章介绍了如何在Qt环境中使用子线程安全地更新主窗口UI。子线程不能直接修改UI,因此定义了一个名为UpdateThread的类,该类继承自QThread并发射一个UpdateUI信号。在主线程的Widget类中,定义了appendText槽函数来响应这个信号并更新文本编辑框的内容。通过connect函数建立信号和槽的连接,确保在子线程运行时,UI更新由主线程正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子线程不能直接修改主窗口,必须发送信号给主线程,由主线程进行修改。

解决方法是可以在子线程中定义相应的信号,主窗口线程定义好相应的槽函数,在主线程中通过connect将信号与槽关联起来。

UpdateThread.h:

//
// Created by 10623 on 2023/4/14.
//

#ifndef UNTITLED_UPDATETHREAD_H
#define UNTITLED_UPDATETHREAD_H
#include <Qthread>

class UpdateThread:public QThread
{
    Q_OBJECT
protected:
    void run();
public:
    explicit UpdateThread(QObject* parent = 0);
signals:
    void UpdateUI(QString text);
};


#endif //UNTITLED_UPDATETHREAD_H

UpdateThread.cpp:

//
// Created by 10623 on 2023/4/14.
//

#include "UpdateThread.h"

UpdateThread::UpdateThread(QObject* parent):QThread(parent)
{
}

void UpdateThread::run()
{
    emit UpdateUI("Begin");
    for(int i=0;i<10;i++)
    {
        emit UpdateUI(QString::number(i));
        sleep(1);
    }
    emit UpdateUI("End");
}

Widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPlainTextEdit>
#include "UpdateThread.h"

class Widget : public QWidget
{
Q_OBJECT

    UpdateThread m_thread;
    QPlainTextEdit textEdit;
protected slots:
    void appendText(QString text);
public:
    Widget(QWidget *parent = 0);
    ~Widget();
};

#endif // WI

Widget.cpp:

#include "Widget.h"

Widget::Widget(QWidget *parent)
        : QWidget(parent)
{
    textEdit.setParent(this);
    textEdit.move(20, 20);
    textEdit.resize(200, 150);
    textEdit.setReadOnly(true);
    //在主窗口中声明槽函数,接收子线程发来的信号修改主窗口
    connect(&m_thread,&UpdateThread::UpdateUI, this, &Widget::appendText);

    m_thread.start();
}

void Widget::appendText(QString text)
{
    textEdit.appendPlainText(text);
}

Widget::~Widget()
{

}

main.cpp:

//
// Created by 10623 on 2023/4/14.
//
#include <QApplication>
#include "Widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc,argv);
    Widget w;
    w.show();
    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值