如何在下一个函数调用之前完全显示QMessageBox

时间:2013-08-08 23:40:08

标签: c++ qt

我想使用QMessageBox向用户宣布一个较短的等待间隔。

QMessageBox* box(new QMessageBox(QMessageBox::Information,"Parser","Processing " + mFileName));
box->setStandardButtons(QMessageBox::NoButton);
box->setWindowModality(Qt::WindowModal);
box->show();
QApplication::processEvents();

parser.analyseFile(mFileName);

box->hide();
box->deleteLater();
QApplication::processEvents();

该功能只需几秒钟。 显示该框,但在功能完成之前,图标和文本都没有及时显示。为什么QApplication::processEvents();在完全显示框之前不会阻止程序继续。 是否有可能在不诉诸线程的情况下实现所需的行为。

1 个答案:

答案 0 :(得分:1)

在单独的线程中进行处理将是更可取的,因为这将使GUI线程在任务完成时自由地执行诸如处理鼠标事件,窗口大小调整等操作;这样GUI就不会暂时“冻结”。

但是,如果您不想生成线程,则可以在analyseFile()函数中定期调用processEvents(),这将给您大致相同的行为。尝试至少每隔50mS调用一次,以避免GUI响应缓慢。

第二种可能性是在某处添加一个插槽:

void MyClass :: ParseFile()
{
   parser.analyseFile(mFileName);
   box->hide();
   box->deleteLater();
}

...然后像这样异步调用它:

QTimer::singleShot(0, this, SLOT(ParseFile()));

... 可能给窗口系统足够的时间在ParseFile()执行之前完成显示QMessageBox,或者它可能没有(在这种情况下你可以尝试从0增加延迟参数)比如说100毫秒。这有点hacky,但它可以工作。