如何在QT中停止并启动循环?

时间:2014-07-03 09:26:09

标签: c++ qt

我一直试图找出如何让程序在for循环中停止并等待单击按钮并继续for循环。

是否有任何简单的方法可以像QSystem.stop()一样停止循环,并在按钮单击的函数QSystem.star()中继续循环。

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

2 个答案:

答案 0 :(得分:3)

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

您可以做的是创建第二个线程并等待条件变量。 GUI线程可以在按钮单击事件槽中发出该条件变量的信号。

  

在C ++中,您可以使用系统(&#34;暂停&#34;)或程序停止

确切地说:该程序已停止。这意味着它无法从操作系统中获取事件。但是从stdin接收数据不是一个事件。它阻止了流式I / O.图形用户界面是基于事件的。

请注意,从概念上讲,考虑用户界面来提供流式I / O通道并不是真的不可能。但是,这在单线程程序中不起作用。您需要并行执行(协同程序,线程等)才能使这样的概念起作用。

答案 1 :(得分:2)

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

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
   ...
}