在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() 
+0

使用按钮的情况下,它应该有一个点击事件,所以实现插槽和连接它们。另请参阅 - > https://wiki.qt.io/How_to_Use_QPushButton/de – retinotop

+0

以及为什么要使用while循环无法执行任何操作?是否可以尝试启动多线程应用程序并在while循环中等待事件? – retinotop

+0

因为我不想进入下一次迭代,直到收到clicked()事件。 – floflo29

所以,我分享了轻微的怀疑,你是否应该想这样做你所描述的。另外,我分享一下,如果你展示更多的代码来描述上下文会更好。

说了这话之后,下面的代码就是你似乎要描述的东西。请注意,这绝不意味着是生产就绪的代码,但更多是一个粗略的例子来说明原则。

会发生什么事,我称之为一个功能上的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() 
+0

我在几个小时前解决了它,感谢QCoreApplication.processEvents()在看到您的答案之前。而你的回答证实这是解决问题的方法! – floflo29