写一个简单的demo做个实验:
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QThread>
#include <iostream>
using namespace std;
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QTimer::singleShot(2000, this, [=](){
cout<<"woshuile";
QThread::msleep(2000);
cout<<"woxingle";
});
}
把timeout设置为0的时候现象很明显,界面立马就卡死了,说明QThread::msleep(2000)占用了UI线程(主线程).
把timeout设置为2000的时候,快速点击了几下button,界面卡了十几秒之后恢复.
基本上石锤:QTimer timeout之后在其对象所在的线程中执行.