我一直试图找出如何让程序在for循环中停止并等待单击按钮并继续for循环。
是否有任何简单的方法可以像QSystem.stop()
一样停止循环,并在按钮单击的函数QSystem.star()
中继续循环。
在C ++中,您可以使用system("pause")
或使用cin<<
时停止的程序。但是我如何在QT中做到这一点?
答案 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
...
}