我如何停止和开始一个循环在QT

How do I stop and start a loop in QT?

本文关键字:一个 循环 QT 何停止 开始      更新时间:2023-10-16

我一直在努力弄清楚如何使程序停止在for循环中,等待一个按钮被点击,for循环继续。

难道没有像QSystem.stop()这样简单的停止循环的方法,在按钮点击功能QSystem.star(),循环继续。

在c++中,你可以使用system("pause")或者当你使用cin<<时程序停止。但是我如何在QT中做到这一点?

因为用户界面需要它的代码才能运行,如果您停止事件循环(这也意味着从事件循环中调用的任何函数都被阻塞,等待某个事件),您也会停止用户界面,这意味着进入窗口的点击将不会被处理。这就是为什么在基于事件的编程中(所有 UI工具包都是这样做的),必须尽快返回到主事件处理程序循环。

你能做的是创建第二个线程并等待一个条件变量。GUI线程可以通知按钮单击事件槽中的条件变量。

在c++中你可以使用system("pause")或者程序停止

Exactly:程序已停止。这意味着它不会从操作系统获取事件。然而,从stdin接收数据并不是一个事件。它阻塞流I/O。图形用户界面是基于事件的。

注意,从概念上讲,想一个用户界面来提供流I/O通道并不是不可能的。然而,这在单线程程序中不起作用。您需要并行执行(协同程序、线程等)才能使这样的概念发挥作用。

你不需要线程,嵌套的事件循环将完成这项工作。

int waitUntilSignalIsEmitted(QObject *sender, const char *signal) {
    QEventLoop loop;
    connect(sender, signal,
            &loop, SLOT(quit()));
    return loop.exec();
}
// usage:
while(yourLoopCondition) {
   // some stuff
   ...
   // pause here
   waitUntilSignalIsEmitted(yourContinuationButton, SIGNAL(clicked()));
   // loop continuation
   ...
}