thread.h
#ifndef THREAD_H
#define THREAD_H
#include <QThread>
class Thread : public QThread
{
Q_OBJECT
public:
explicit Thread();
protected:
void run();
signals:
void sendCloseFlag(int);
};
#endif // THREAD_H
thread.cpp
#include "thread.h"
#include <QDebug>
#include <QWidget>
Thread::Thread()
{
}
void Thread::run()
{
qDebug() << "thread run: " << thread()->currentThreadId();
// QWidget *w = new QWidget;//ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel\qwidget.cpp, line 1126
for(int i = 0; i < 5000; i++)//不打印信息,1亿次需要半秒不到,10亿次需要2秒
{
qDebug() << i << endl;
}
sendCloseFlag(1);
}
widget.h
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
private:
int closeFlag;
public slots:
void setCloseFlag(int);
};
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
qDebug() << "widget thread: " << thread()->currentThreadId();
closeFlag = 0;
}
Widget::~Widget()
{
qDebug() << "~Widget()";
delete ui;
}
void Widget::setCloseFlag(int flag)
{
closeFlag = flag;
close();
}
main.cpp
#include "widget.h"
#include <QApplication>
#include <QDebug>
#include "thread.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << "main thread: " << qApp->thread()->currentThreadId();
Widget w;
w.show();
Thread thread;
QObject::connect(&thread, SIGNAL(sendCloseFlag(int)), &w, SLOT(setCloseFlag(int)));
thread.start();
return a.exec();
}
注意点:
1. 线程里面不能直接操作UI。
2. 只有线程的run方法才会进入新线程中,其他都是属于主线程。