在Qt的while循环中等待clicked()事件
如何在每次迭代时在for循环内等待用户按下给定的QPushButton?在Qt的while循环中等待clicked()事件
for i in range(10):
while (the button has not been pressed):
#do nothing
#do something
主要问题是我无法捕获while循环中的clicked()事件。
编辑:
最后,我结束了:
for i in range(10):
self.hasBeenProcessed = False
# only one function can modify this boolean
# and this function is connected to my button
while (self.hasBeenProcessed is not True):
QtCore.QCoreApplication.processEvents()
所以,我分享了轻微的怀疑,你是否应该想这样做你所描述的。另外,我分享一下,如果你展示更多的代码来描述上下文会更好。
说了这话之后,下面的代码就是你似乎要描述的东西。请注意,这绝不意味着是生产就绪的代码,但更多是一个粗略的例子来说明原则。
会发生什么事,我称之为一个功能上的Button1
新闻和我保持while
循环内的事件循环纺纱通过调用QCoreApplication.processEvents()
这意味着GUI仍然会接受如鼠标事件。现在,这是你应该而不是通常做的事情。然而,在某些情况下可能需要这种情况,例如,如果你有一个非模态QProgressDialog
,并要保持GUI更新而对话计数器增加(见例如http://doc.qt.io/qt-4.8/qprogressdialog.html#value-prop)
然后第二部分是只有当你按下按钮2修改全局变量在第二个功能并且while
循环将退出。
让我知道,如果这有助于
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
btn2pushed = False
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print "Button 1 clicked"
i = 0
while (btn2pushed != True):
# not doing anything
if (i % 100000 == 0):
print "Waiting for user to push button 2"
QCoreApplication.processEvents()
i += 1;
print "Button 2 has been pushed"
def b2_clicked():
global btn2pushed
btn2pushed = True
if __name__ == '__main__':
window()
我在几个小时前解决了它,感谢QCoreApplication.processEvents()在看到您的答案之前。而你的回答证实这是解决问题的方法! – floflo29
使用按钮的情况下,它应该有一个点击事件,所以实现插槽和连接它们。另请参阅 - > https://wiki.qt.io/How_to_Use_QPushButton/de – retinotop
以及为什么要使用while循环无法执行任何操作?是否可以尝试启动多线程应用程序并在while循环中等待事件? – retinotop
因为我不想进入下一次迭代,直到收到clicked()事件。 – floflo29