QT在循环中更新界面

本文分享了如何在项目中避免长时间假死状态,通过移除QEventLoop并使用test变量实时更新表格。作者介绍了如何利用`Sleep()`和`QCoreApplication::processEvents()`实现数据到达即显示,同时提供了一个简洁的解决方案。
摘要由CSDN通过智能技术生成

最近有一个项目需要将采集结果显示在一个表格中,但是每个数据都需要一定的时间才能够得到,如果等全部数据都得到后再填充表格,会有很长一段时间处于假死状态,为了改善用户体验,要得到一个数据就填充一个表格,查资料后使用QEventLoop类和QCoreApplication::processEvents()函数实现了功能,并且可以随时中断表格的填充,类和函数说明请按F1,后来发现QEventLoop并不是必须的,用在这里比较累赘,改成test标志变量代码更简洁些。
具体代码如下:

//包含头文件
#include <QTimer>
#include <QEventLoop>
#include <windows.h>
//类中声明
QEventLoop myLoop;//开始的时候以为必须要使用这个
bool test;//后来发现直接使用变量来判断是否退出就可以了

void Dialog::on_pushButton_clicked()
{
 //   QTimer::singleShot(1, this, &Dialog::fillTable);
 //   myLoop.exec();
 //这里直接使用test变量来退出循环
 fillTable();
}

void Dialog::fillTable()
{
    test = 0;
    for (int row = 0; row < 10; ++row) {
        for (int col = 0; col < 10; ++col) {
            ui->tableWidget->setItem(
                        row, col, new QTableWidgetItem(QString::number(row * 10 + col)));
            if (!row) {
                ui->tableWidget->horizontalHeader()->setSectionResizeMode(col, QHeaderView::ResizeToContents);
            }
            Sleep(100);
            //只要再循环中加入它,就可以让窗体马上刷新显示或者接受其它事件
            QCoreApplication::processEvents();
 //           if (!myLoop.isRunning())
            if (test)
                break;
        }
//        if (!myLoop.isRunning())
        if (test)
            break;
    }
 //   myLoop.quit();
}

void Dialog::on_pushButton_2_clicked()
{
    test = 1;
 //   myLoop.quit();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值