最近有一个项目需要将采集结果显示在一个表格中,但是每个数据都需要一定的时间才能够得到,如果等全部数据都得到后再填充表格,会有很长一段时间处于假死状态,为了改善用户体验,要得到一个数据就填充一个表格,查资料后使用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();
}