如果想在程序中使用延时或者定时功能,一般使用sleep或者定时器QTimer。想要在子线程中使用QTimer改怎么使用呢?
第一次
线程类
#pragma once
#include <QThread>
class QTimer;
class QtMyThread : public QThread {
Q_OBJECT
public:
QtMyThread(QObject *parent);
~QtMyThread();
private:
void run()override;
private slots:
void slotTimeOut();
signals:
void sigFlag(int i);
private:
QTimer* _timer = nullptr;
int _i = 0;
};
#include "QtMyThread.h"
#include <QTimer>
QtMyThread::QtMyThread(QObject *parent)
: QThread(parent) {
}
QtMyThread::~QtMyThread() {
}
void QtMyThread::run() {
_timer = new QTimer();
connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeOut()));
_timer->start(1000);
}
void QtMyThread::slotTimeOut() {
_i++;
emit sigFlag(_i);
}
UI
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_Test.h"
class QtMyThread;
class Test : public QMainWindow {
Q_OBJECT
public:
Test(QWidget *parent = Q_NULLPTR);
private:
void init();
private slots:
void slotStartThread();
void slotFlag(int i);
private:
QtMyThread* _myThread = nullptr;
private:
Ui::TestClass ui;
};
#include "Test.h"
#include "ThreadTimer/QtMyThread.h"
Test::Test(QWidget *parent)
: QMainWindow(parent) {
ui.setupUi(this);
init();
}
void Test::init() {
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slotStartThread()));
_myThread = new QtMyThread(this);
connect(_myThread, SIGNAL(sigFlag(int)), this, SLOT(slotFlag(int)));
}
void Test::slotStartThread() {
_myThread->start();
}
void Test::slotFlag(int i) {
ui.label->setText(QString::number(i));
}
当点击【开始】,发现定时器并没有运行
解决方案:需要在线程中添加时间循环处理函数 exec()
第二次
#include "QtMyThread.h"
#include <QTimer>
QtMyThread::QtMyThread(QObject *parent)
: QThread(parent) {
}
QtMyThread::~QtMyThread() {
}
void QtMyThread::run() {
_timer = new QTimer();
connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeOut()));
_timer->start(1000);
exec();
}
void QtMyThread::slotTimeOut() {
_i++;
emit sigFlag(_i);
}
点击按钮【开始】定时器已经运行起来了,但是通过断点发现,定时器还是在主线程中运行的。
解决方案:connect默认的连接方式Qt::AutoConnection,需要改成Qt::DirectConnection
第三次
#include "QtMyThread.h"
#include <QTimer>
QtMyThread::QtMyThread(QObject *parent)
: QThread(parent) {
}
QtMyThread::~QtMyThread() {
}
void QtMyThread::run() {
_timer = new QTimer();
connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeOut()), Qt::DirectConnection);
_timer->start(1000);
exec();
}
void QtMyThread::slotTimeOut() {
_i++;
emit sigFlag(_i);
}
这样就可以在子线程中运行定时器了
源码下载
aaa