2016-09-07 64 views
0

如何在每次迭代時在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

回答

2

所以,我分享了輕微的懷疑,你是否應該想這樣做你所描述的。另外,我分享一下,如果你展示更多的代碼來描述上下文會更好。

說了這話之後,下面的代碼就是你似乎要描述的東西。請注意,這絕不意味着是生產就緒的代碼,但更多是一個粗略的例子來說明原則。

會發生什麼事,我稱之爲一個功能上的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