以前自己让Qt主线程等待的办法就是用QThread::msleep()。但这是不对的。这样做的问题是,msleep期间主线程不能响应用户的操作,处于“死机”状态。根据https://www.twblogs.net/a/5b96b6182b717750bda550bdhttps://www.twblogs.net/a/5b96b6182b717750bda550bd
的说法,应采用QElapsedTimer结合processEvents()来实现等待。
以下是我尝试的代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCoreApplication>
#include <QElapsedTimer>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QElapsedTimer t;
t.start();
while(t.elapsed()<5000){
QCoreApplication::processEvents();
}
ui->label->setText("5 sec passed");
}
实际效果,在进入while循环之后,窗口仍可以被拖动,不会卡住:
WeChat_20220417181750
上述办法其实也不是很好的方案。权威的解法见https://doc.qt.io/archives/qq/qq27-responsive-guis.html