我想使用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();
在完全显示框之前不会阻止程序继续。
是否有可能在不诉诸线程的情况下实现所需的行为。
答案 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,但它可以工作。