子线程不能直接修改主窗口,必须发送信号给主线程,由主线程进行修改。
解决方法是可以在子线程中定义相应的信号,主窗口线程定义好相应的槽函数,在主线程中通过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();
}