在插槽运行期间刷新/更新 GUI

Posted

技术标签:

【中文标题】在插槽运行期间刷新/更新 GUI【英文标题】:refresh/update GUI during slot running 【发布时间】:2012-12-28 23:57:14 【问题描述】:

GUI 元素的所有属性(文本、项目 ...)在插槽完成运行后都会更新,并且我有一个显示应用程序状态的小标签(即“正在刷新 ...”、“正在配置 . ..”、“正在扫描...”、“完成”等)在触发的插槽运行期间。

如何在触发槽后立即将标签的文本设置为“正在刷新...”之类的内容,并且在槽快完成时将标签的文本更改为“完成”之类的内容?

目前我正在通过发布来做到这一点

    ui->Status->setText("Refreshing ...");
    ...
    ui->Status->setText("Done");

在插槽内,但只有在插槽完成后才能看到更改,所以我永远看不到“正在刷新...”。

很抱歉,这很容易,但我是 OOP 的新手,我一直在按顺序思考。

【问题讨论】:

Forcing the Qt GUI to update before entering a separate function 的可能重复项 Hmm .. 确实是重复的,但是给定的解决方案(repaint() 或 processEvents() )都不起作用。在插槽运行期间,标签的文本仍然没有变化。 哇.. 最初我尝试调用建议的 ui->Status->repaint();就在使用 QProcces 启动程序之前,该程序将应用程序置于睡眠模式,直到程序终止,但没有工作。我意识到重绘没有足够的时间来重绘,所以我尝试了 repaint(),休眠一秒钟,然后创建 QProcces,但这也不起作用。然后我生气了,在创建 QProcces 之前调用了 10 次 repaint() .. 瞧:D 【参考方案1】:

这就是我当时最终做的事情。 “qApp->processEvents();”是关键。 Repaint() 是不够的。

void Widget::SetStatus(QString status)

   ui->Status->setText(status);
   ui->Status->repaint();
   qApp->processEvents();

【讨论】:

以上是关于在插槽运行期间刷新/更新 GUI的主要内容,如果未能解决你的问题,请参考以下文章

在构建期间启用刷新edmx或从数据库更新模型

将只有插槽的 QGLWidget 移动到不同的线程

在模拟期间通过 GUI 读取用户的输入 [关闭]

从在非 GUI 线程中运行的 C 代码获取 QInputDialog::getText() 结果

Swing GUI 在数据处理期间不更新

更新期间休眠不刷新