新建基于widget的项目,UI中添加两个pushbutton,和一个textEdit
接下来编写槽函数
操作一:
void Widget::on_btn1_clicked()
{ static int count=0;
for(int i=1;i<1000000000;i++)
count+=i;
ui->textEdit->setText(QString::number(count));
}
操作二:
void Widget::on_btn2_clicked()
{
ui->textEdit->setText("Hello world!");
}
运行程序,点击操作一,
发现程序无响应,此时没有办法再进行操作,这是因为操作一所需要时间很长,而程序要等到它操作完成才能进行其他操作。
我们加入线程再试试看效果如何。
首先通过右键工程,加入基于c++类Thread,
类头文件Thread.h
#ifndef THREAD_H
#define THREAD_H
#include<QObject>
#include<QThread>
class Thread :public QThread{
Q_OBJECT
public:
Thread();
signals:
void returnResult(int);
protected:
void run();
};
#endif // THREAD_H
Thread.cpp
#include "Thread.h"
Thread::Thread()
{
//
}
void Thread::run()
{
int result = 0;
for(int i = 0; i < 2000000000; i++)
result += i;
emit returnResult(result); //将结果放在信号中
}
Widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QString>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
thread=new Thread();
ui->setupUi(this);
QObject::connect(thread,SIGNAL(returnResult(int)),this,SLOT(displayResult(int)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btn1_clicked()
{
thread->start();
}
void Widget::on_btn2_clicked()
{
ui->textEdit->setText("Hello world!");
}
void Widget::displayResult(int result)
{
ui->textEdit->setText(QString::number(result));
}
运行程序、点击操作一,进入线程,点击操作二,显示文字,线程跑完就显示线程一的结果。再次过程中,操作一的线程并没有阻塞到操作二,这就是线程的简单使用。
另外,使用Thread的简单过程:添加C++类,手动修改定义,继承于QThread类,再在类的头文件重新声明run():
virtual void run();
再定义run,之后创建类的对象,使用start进行调用run();