1【QT】多线程
# ifndef MYWIDGET_H
# define MYWIDGET_H
# include <QWidget>
namespace Ui {
class MyWidget ;
}
class MyWidget : public QWidget
{
Q_OBJECT
public :
explicit MyWidget ( QWidget * parent = 0 ) ;
~ MyWidget ( ) ;
signals:
void notify ( ) ;
private slots:
void on_pushButton_clicked ( ) ;
private :
Ui:: MyWidget * ui;
QThread * pThread;
} ;
# endif
# ifndef WORKER_H
# define WORKER_H
# include <QObject>
class Worker : public QObject
{
Q_OBJECT
public :
explicit Worker ( QObject * parent = nullptr ) ;
signals:
public slots:
void onNotify ( ) ;
private :
void doSomeThing ( ) ;
} ;
# endif
# include "MyWidget.h"
# include <QApplication>
int main ( int argc, char * argv[ ] )
{
QApplication a ( argc, argv) ;
MyWidget w;
w. show ( ) ;
return a. exec ( ) ;
}
# include "MyWidget.h"
# include "ui_MyWidget.h"
# include <QThread>
# include "Worker.h"
MyWidget :: MyWidget ( QWidget * parent) :
QWidget ( parent) ,
ui ( new Ui:: MyWidget)
{
ui-> setupUi ( this ) ;
pThread= new QThread ( this ) ;
Worker * p= new Worker;
p-> moveToThread ( pThread) ;
connect ( pThread, & QThread:: finished, p, & Worker:: deleteLater) ;
connect ( this , & MyWidget:: notify, p, & Worker:: onNotify) ;
pThread-> start ( ) ;
}
MyWidget :: ~ MyWidget ( )
{
pThread-> quit ( ) ;
pThread-> wait ( ) ;
delete ui;
}
void MyWidget :: on_pushButton_clicked ( )
{
emit notify ( ) ;
}
# include "Worker.h"
# include <QThread>
# include <QDebug>
Worker :: Worker ( QObject * parent) : QObject ( parent)
{
}
void Worker :: onNotify ( )
{
doSomeThing ( ) ;
}
void Worker :: doSomeThing ( )
{
for ( int i= 0 ; i< 10 ; ++ i)
{
QThread :: sleep ( 1 ) ;
qDebug ( ) << i;
}
}
这里特别需要注意一种【ui】调试方法:【qdebug】调试
2【QT】进度条
用于描述程序执行状态
2.1利用行编辑器显示子线程执行状态
# ifndef MYWIDGET_H
# define MYWIDGET_H
# include <QWidget>
namespace Ui {
class MyWidget ;
}
class MyWidget : public QWidget
{
Q_OBJECT
public :
explicit MyWidget ( QWidget * parent = 0 ) ;
~ MyWidget ( ) ;
signals:
void notify ( ) ;
private slots:
void on_pushButton_clicked ( ) ;
void onFn ( int n) ;
private :
Ui:: MyWidget * ui;
QThread * pThread;
} ;
# endif
# ifndef WORKER_H
# define WORKER_H
# include <QObject>
class Worker : public QObject
{
Q_OBJECT
public :
explicit Worker ( QObject * parent = nullptr ) ;
signals:
void fn ( int n) ;
public slots:
void onNotify ( ) ;
private :
void doSomeThing ( ) ;
} ;
# endif
# include "MyWidget.h"
# include <QApplication>
int main ( int argc, char * argv[ ] )
{
QApplication a ( argc, argv) ;
MyWidget w;
w. show ( ) ;
return a. exec ( ) ;
}
# include "MyWidget.h"
# include "ui_MyWidget.h"
# include <QThread>
# include "Worker.h"
MyWidget :: MyWidget ( QWidget * parent) :
QWidget ( parent) ,
ui ( new Ui:: MyWidget)
{
ui-> setupUi ( this ) ;
pThread= new QThread ( this ) ;
Worker * p= new Worker;
p-> moveToThread ( pThread) ;
connect ( pThread, & QThread:: finished, p, & Worker:: deleteLater) ;
connect ( this , & MyWidget:: notify, p, & Worker:: onNotify) ;
connect ( p, & Worker:: fn, this , & MyWidget:: onFn) ;
pThread-> start ( ) ;
}
MyWidget :: ~ MyWidget ( )
{
pThread-> quit ( ) ;
pThread-> wait ( ) ;
delete ui;
}
void MyWidget :: on_pushButton_clicked ( )
{
emit notify ( ) ;
}
void MyWidget :: onFn ( int n)
{
ui-> lineEdit-> setText ( QString :: asprintf ( "%d" , n) ) ;
}
# include "Worker.h"
# include <QThread>
# include <QDebug>
Worker :: Worker ( QObject * parent) : QObject ( parent)
{
}
void Worker :: onNotify ( )
{
doSomeThing ( ) ;
}
void Worker :: doSomeThing ( )
{
for ( int i= 0 ; i< 10 ; ++ i)
{
QThread :: sleep ( 1 ) ;
# if 0
qDebug ( ) << i;
# endif
# if 1
emit fn ( i) ;
# endif
}
}
2.2利用进度条显示子线程执行状态
实现方法:在进度条槽函数中添加set方法,使得进度条当前值与槽函数接收到的信号值同步,就实现了进度条动态增长。
void MyWidget :: onFn ( int n)
{
ui-> lineEdit-> setText ( QString :: asprintf ( "%d" , n) ) ;
ui-> progressBar-> setValue ( n) ;
}