1

我想使用 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();在框完全显示之前不阻止程序继续运行。是否有可能在不求助于线程的情况下实现所需的行为。

4

1 回答 1

1

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

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

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

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

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

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

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

于 2013-08-08T23:54:02.747 回答