在qt中同时更新和控制GUI


疯子哥哥
2025-03-12 06:47:40 (2天前)
  1. 我正在尝试创建一个用于控制和监视的GUI


产业
</跨度>
机器在QT。 GUI应该使用机器的测量值每300ms更新一次。我应该能够控制 计时器槽执行,GUI没有响应。我也试过使用信号和插槽技术。结果相同。我无法找到解决方案

互联网
</跨度>
。如果有人可以提供帮助,我会很高兴。提前致谢。

3 条回复
  1. 0# 时间 | 2019-08-31 10-32



    这有三种主要方法,每种方法都有其优点和缺点。




    简单,不可扩展的解决方案
    </强>





    最简单的方法是打电话

    QApplication::processEvents()

    手动在“繁忙”代码中。例如,要手动更新每个循环的GUI,您可以这样做:




    1. for (int i = 0; i < 5000; ++i) {
      label->setText(tr(“At Index %1…”).arg(i));
      QApplication::processEvents();
      }

    2. </code>




    优点

    </强>




    1. 很容易


    2. 没有并发问题

    3. </醇>




      缺点

      </强>




      1. 功能非常有限


      2. 污染代码

      3. </醇>



        主题
        </强>



        如果你想要一个简单的解决方案,但是可扩展的解决方案,继承QThread,然后在一个单独的线程中运行非GUI任务是一个很好的方法:




        1. class MyThread: QThread
          {
          Q_OBJECT

        2. void run()
        3. {
        4.     for (size_t i = 0; i < 50000; ++i) {
        5.         std::cout << i << std::endl;
        6.     }
        7. }
        8. };

        9. auto *thread = new MyThread;
          thread->start();

        10. </code>


        当这个长任务发生时,GUI将更新,Qt将负责垃圾收集。







        优点

        </强>




        1. 相当简单


        2. 强大,可扩展,信号/插槽允许数据交换

        3. </醇>




          缺点

          </强>






          1. 不能
            </强>
            从主线程以外的任何线程更新GUI。


          2. 信号/插槽必须使用QueuedConnection。

          3. </醇>



            事件循环
            </强>



            最后一种方法是Qt的原生解决方案:QEventLoop。




            1. QTimer timer;
              QEventLoop loop;

            2. timer.setSingleShot(true);
              connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));

            3. timer.start(5000);
              loop.exec();

            4. </code>


            这实际上不太直观,但在大多数情况下通过避免忙碌等待恰好好得多。







            优点

            </强>




            1. 最小的CPU使用率

            2. </醇>




              缺点

              </强>




              1. 不太直观。

              2. </醇>


                你可以阅读更多

                这里

                。我最初拥有一个具有相同信息的现代资源,因此如果您在Qt5文档中找到类似的链接,请编辑此帖子。


  2. 1# 猫南北 | 2019-08-31 10-32



    我发现了问题所在。这不是我想象的那样。我要求每隔30毫秒与我通信的机器的状态。我把它增加到了3000毫秒,现在它工作正常。即使在执行另一个插槽时单击该按钮,该按钮也不会引起任何问题。这是一个愚蠢的问题。感谢大家的帮助。所有答案都非常有用。再次感谢。


登录 后才能参与评论