一、说明
平时用到两种延时方式QThread::sleep()和QTimer::singleShot()
1、QThread::sleep()
QThread类中如下三个静态函数:
QThread::sleep(n); //延迟n秒
QThread::msleep(n); //延迟n毫秒
QThread::usleep(n); //延迟n微妙
这种方式使用简单,但是会阻塞线程,有界面时界面会卡死,一般在非GUI线程中使用。
2、QTimer::singleShot与QEventLoop搭配使用
QEventLoop loop;
QTimer::singleShot(int(n), &loop, SLOT(quit()));
loop.exec();
创建一个事件循环,在n毫秒之后,退出这个事件,相当于延迟了n毫秒;
在子事件循环中,父事件循环仍然是可以执行的,所以不会堵塞线程。
二、sleep()使用
新建一个Qt项目
在界面上放置一个PushButton,右击,选择”转到槽”,选择“clicked()”
更改.cpp中的代码如下
#include "mainwindow.h" #include "ui_mainwindow.h" #include#include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { qDebug() << QTime::currentTime().toString("hh:mm:ss"); QThread::sleep(10); qDebug() << QTime::currentTime().toString("hh:mm:ss"); }
运行程序,点击“PushButton”,输出框输出当前时间,在十秒之内拖拽界面,是无法拖拽的,标题栏提示“未响应”
十秒之后,输出框又输出一个当前时间信息,此时界面可以随意拖拽了
三、QTimer::singleShot与QEventLoop搭配使用
更改(二)中的代码
#include "mainwindow.h" #include "ui_mainwindow.h" #include#include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { qDebug() << QTime::currentTime().toString("hh:mm:ss"); QEventLoop loop; QTimer::singleShot(int(1000*10), &loop, SLOT(quit())); loop.exec(); qDebug() << QTime::currentTime().toString("hh:mm:ss"); }
运行程序,点击“PushButton”,输出框输出当前时间,可以随意拖拽界面
十秒之后,输出框又输出一个当前时间信息
还没有评论,来说两句吧...