前言:在QT中大多数情况都是异步运行的,一般情况都是可以通过回调和槽函数都可以搞定。本文主要是描述一种以线程的方式来实现的方法。
1、引入管理线程的类
其中dowork()是线程通常说的入口函数。
class MyThread : public QObject
{
Q_OBJECT
public:
MyThread(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork();
};
2、在Widget窗口结构体的操作
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
private:
QThread *m_thread;
MyThread *m_worker;
public slots:
void push_it();
};
3、主体的执行部分
这里我是加入了一个按键的槽函数控制线程的开关。
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(push_it()));
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_thread = new QThread(this);
m_worker = new MyThread(this);
//m_worker->moveToThread(m_thread);
connect(m_thread, &QThread::started, m_worker, &MyThread::doWork);
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(push_it()));
}
//线程
Widget::~Widget()
{
// 等待线程结束
m_thread->quit();
m_thread->wait();
// 删除线程和工作对象
delete m_worker;
delete m_thread;
delete ui;
}
void Widget::push_it()
{
if(ui->pushButton->text()=="push"){
m_thread->quit();
ui->pushButton->setText("start");
} else {
m_thread->start();
ui->pushButton->setText("push");
}
}
int count = 0;
void MyThread::doWork()
{
//while(1){
qDebug("do work for what:%d",count++);
// }
}