我正在尝试创建用于在 QT 中控制和监视工业机器的 GUI。 GUI 应每 300 毫秒更新一次来自机器的测量值。而且我应该可以同时控制机器。我正在做的(错误的)是我试图使用每 300 毫秒触发一次的计时器更新 GUI 中的测量值。但是,如果我在执行定时器槽的同时单击我的控制按钮,则 GUI 没有响应。我也尝试过使用信号和插槽技术。同样的结果。我无法在互联网上找到解决方案。如果有人能提供帮助,我会很高兴。提前致谢。
最佳答案
执行此操作有三种主要方法,每种方法各有优缺点。
简单、不可扩展的解决方案
最简单的方法是在您的“繁忙”代码中手动调用QApplication::processEvents()
。例如,要在每个循环中手动更新 GUI,您可以这样做:
for (int i = 0; i < 5000; ++i) {
label->setText(tr("At Index %1...").arg(i));
QApplication::processEvents();
}
优点
- 非常简单
- 没有并发问题
缺点
- 功能非常有限
- 污染代码
线程
如果您想要一个简单但可扩展的解决方案,子类化 QThread 然后在单独的线程中运行非 GUI 任务是一个很好的方法:
class MyThread: QThread
{
Q_OBJECT
void run()
{
for (size_t i = 0; i < 50000; ++i) {
std::cout << i << std::endl;
}
}
};
auto *thread = new MyThread;
thread->start();
当那个长任务发生时,GUI 会更新,Qt 会负责垃圾收集。
优点
- 相当简单
- 稳健、可扩展且信号/槽允许数据交换
缺点
- 您不能从主线程以外的任何线程更新 GUI。
- 信号/槽必须使用 QueuedConnection。
事件循环
最后一种方法是 Qt 的原生解决方案:QEventLoop。
QTimer timer;
QEventLoop loop;
timer.setSingleShot(true);
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
timer.start(5000);
loop.exec();
这明显不那么直观,但在大多数情况下通过避免忙等待会好得多。
优点
- CPU 使用率最低
缺点
- 不太直观。
您可以阅读更多here .我最初有一个包含相同信息的现代资源,所以如果您在 Qt5 文档上找到类似的链接,请编辑这篇文章。
关于c++ - qt中GUI同时更新和控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45047432/