【问题标题】:Forcing the Qt GUI to update before entering a separate function在输入单独的函数之前强制 Qt GUI 更新
【发布时间】:2012-09-06 18:53:36
【问题描述】:

这似乎应该是自动的,但显然不是。我有以下代码:

    ui.my_label->setText("Test 1...");
    ui.my_label->adjustSize();

    processThatTakesAbout30SecondsToFinish(files[0].toStdString());

    ui.my_label->setText("Finished.");
    ui.my_label->adjustSize();

发生的情况是我从未看到"Test1...",,因为 GUI 似乎一直挂起,直到以下功能完成,我最终只看到“完成。”。

如何确保 GUI 在进入该功能之前正在更新?
谢谢。

【问题讨论】:

  • 你试过repaint()update()之类的吗?

标签: c++ qt function user-interface


【解决方案1】:

如果您这样做,您应该能够在输入代码之前处理事件队列;

#include <QApplication>

并且,当你想刷新你的 GUI 时,调用;

qApp->processEvents();

请注意,让您长时间运行的进程不时调用该函数可能是个好主意,以使您的 GUI 感觉更灵敏。

【讨论】:

  • 这肯定行得通,尽管我通常会建议不要调用 processEvents,因为如果您的代码不可重入,它可能会导致很多意外问题。
【解决方案2】:

如果您不关心您的 GUI 在此期间是否响应,那么调用 my_label-&gt;repaint() 就可以解决问题。除非你屈服于事件循环,否则 Qt 不能自动为你做任何事情。

为了获得最大的响应能力,您可以考虑在单独的线程中运行您的进程,并在处理完成时使用信号/插槽连接(默认情况下是线程安全的)向您的主 GUI 线程发出信号。

【讨论】:

    【解决方案3】:

    我只是想补充一点,我在这里看到了两个答案的组合。所以对我有用的是:

    ui.my_label->setText("Test 1...");
    ui.my_label->adjustSize();
    
    //! Both of these lines needed
    ui.my_label->repaint();
    qApp->processEvents();
    
    processThatTakesAbout30SecondsToFinish(files[0].toStdString());
    
    ui.my_label->setText("Finished.");
    ui.my_label->adjustSize();
    

    希望这对某人有所帮助。

    【讨论】:

    • self.repaint() after self.progress.setVisible(False) 适用于我的情况
    • 嗯,我也一样。我需要他们两个来工作。你会认为processEvents 会自动重绘所有内容。
    【解决方案4】:

    定义一个函数...

    void YourClass::Update_Ui()
    {
    if(this->isEnabled())
        return;
    
    this->repaint();
    qApp->processEvents();
    }
    

    ...像这样并确保 this 被禁用(以防止用户操作),而您想强制更新 ui 对我来说是最好的解决方案。

    示例如何在函数中使用它(例如在需要大量时间的堆栈处理期间):

    this->setEnabled(false);
    //Do whatever you want
    Update_Ui();
    //Do some other stuff
    this->setEnabled(true);
    

    这不允许用户通过ui 交互来干扰处理(它被禁用)并且在代码中调用Update_Ui(); 时更新并更新整个ui,而不仅仅是选择的标签或其他.请注意,这不会阻止 ui 元素发出的信号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多