dialog.h
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);
}Dialog::~Dialog()
{delete ui;
}// 启动线程按钮
void Dialog::on_startButton_clicked()
{//connect(&thread, SIGNAL(showNum(int)), this, SLOT(updateLabel(int))); //方法一//connect(&thread, &MyThread::showNum, this, &Dialog::updateLabel); //方法二//QObject::connect(发送者, &发送者类::信号, 接收者, &接收者类::槽函数);QObject::connect(&thread, &MyThread::showNum, this, [this](int number) { //方法三QString text = "in MyThread:" + QString::number(number);// 将数字转换为字符串ui->label->setText(text);});thread.start();ui->startButton->setEnabled(false);ui->stopButton->setEnabled(true);
}// 终止线程按钮
void Dialog::on_stopButton_clicked()
{if (thread.isRunning()) {thread.stop();ui->startButton->setEnabled(true);ui->stopButton->setEnabled(false);}
}void Dialog::closeEvent(QCloseEvent *event)
{if (thread.isRunning()){thread.terminate();thread.wait();}
}void Dialog::updateLabel(int number)
{QString text = QString::number(number);// 将数字转换为字符串ui->label->setText(text);// 更新标签中的文本
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include "mythread.h"namespace Ui {
class Dialog;
}class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = nullptr);~Dialog();private slots:void on_startButton_clicked();void on_stopButton_clicked();void updateLabel(int number);private:Ui::Dialog *ui;MyThread thread;// QWidget interface
protected:virtual void closeEvent(QCloseEvent *event) override;
};#endif // DIALOG_H
mythread.cpp
#include "mythread.h"
#include <QDebug>MyThread::MyThread(QObject *parent) :QThread(parent)
{stopped = false;
}void MyThread::run()
{qreal i = 0;while (!stopped) {qDebug() << QString("in MyThread: %1").arg(i);emit showNum(i);msleep(1000);i++;}stopped = false;
}void MyThread::stop()
{stopped = true;
}
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>class MyThread : public QThread
{Q_OBJECT
public:explicit MyThread(QObject *parent = nullptr);void stop();
protected:void run() override;
private:volatile bool stopped;signals:void showNum(int num);
};#endif // MYTHREAD_H