2016-02-13 67 views
0

該示例有兩個窗口,MainFooMain應在Foo關閉後顯示在Foo之前輸入的值。暫停當前功能,直到對話框關閉

Whole picture

的代碼如下:

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class Main(QWidget): 
    def __init__(self): 
     super(Main, self).__init__() 
     self.setupUI() 

    def setupUI(self): 
     self.label = QLabel('0') 

     okBtn = QPushButton('Start Foo') 
     okBtn.clicked.connect(self.startFoo) 

     mainLayout = QVBoxLayout() 
     mainLayout.addWidget(self.label) 
     mainLayout.addWidget(okBtn) 
     self.setLayout(mainLayout) 

     self.setWindowTitle('Main') 
     self.show() 

    def startFoo(self): 
     foo = Foo() 
     # I want the function to suspend until Foo() is destroyed, so I can set label's text as what I input earlier in `Foo` 
     self.label.setText(str(foo.edit.text())) 


class Foo(QDialog): 
    def __init__(self): 
     super(Foo, self).__init__() 
     self.setupUI() 
     self.var = 0 

    def setupUI(self): 

     # QLineEdit 
     self.edit = QLineEdit() 

     # QPushButton 
     okBtn = QPushButton('OK') 
     okBtn.clicked.connect(self.setVar) 

     # main layout 
     mainLayout = QVBoxLayout() 
     mainLayout.addWidget(self.edit) 
     mainLayout.addWidget(okBtn) 
     self.setLayout(mainLayout) 

     self.setWindowTitle('Foo') 
     self.show() 

    def setVar(self): 
     self.var = self.edit.text() 
     self.close() 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    ex = Main() 
    app.exec_() 

注意這部分:

def startFoo(self): 
    foo = Foo() 
    # I want the function to suspend until Foo() is closed, so I can set label's text as what I input earlier in `Foo` 
    self.label.setText(str(foo.edit.text())) 

我想要的功能暫停,直到美孚()被破壞,這樣我就可以設置標籤的文字與我之前在Foo中輸入的內容相同。但該應用程序只是繼續運行,這使得self.label的文本總是空白(因爲當啓動Foo()時,foo.edit.text()None)。我試過添加一個QEventLoop這樣:

def startFoo(self): 
    foo = Foo() 

    loop = QEventLoop() 
    foo.destroyed.connect(loop.quit) 
    loop.exec_() 

    self.label.setText(str(foo.edit.text())) 

它也行不通。那麼該怎麼辦?

回答

2

您需要使用exec_而不是show來顯示Foo對話框。不同的是,雖然show只是顯示對話框窗口,但exec_會將其作爲模式執行,所以只有在UI線程掛起時纔可以與該對話框交互,直到對話框關閉。

import sys 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class Main(QWidget): 

    def __init__(self): 
     super(Main, self).__init__() 
     self.setupUI() 

    def setupUI(self): 
     self.label = QLabel('0') 

     okBtn = QPushButton('Start Foo') 
     okBtn.clicked.connect(self.startFoo) 

     mainLayout = QVBoxLayout() 
     mainLayout.addWidget(self.label) 
     mainLayout.addWidget(okBtn) 
     self.setLayout(mainLayout) 

     self.setWindowTitle('Main') 

    def startFoo(self): 
     foo = Foo() 
     foo.exec_() 
     self.label.setText(str(foo.edit.text())) 


class Foo(QDialog): 

    def __init__(self): 
     super(Foo, self).__init__() 
     self.setupUI() 
     self.var = 0 

    def setupUI(self): 

     # QLineEdit 
     self.edit = QLineEdit() 

     # QPushButton 
     okBtn = QPushButton('OK') 
     okBtn.clicked.connect(self.setVar) 

     # main layout 
     mainLayout = QVBoxLayout() 
     mainLayout.addWidget(self.edit) 
     mainLayout.addWidget(okBtn) 
     self.setLayout(mainLayout) 

     self.setWindowTitle('Foo') 

    def setVar(self): 
     self.var = self.edit.text() 
     self.close() 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    ex = Main() 
    ex.show() 
    app.exec_() 

而且,但這主要是個人意見,而不是一個一般的規則,這是更好地撥打showexec_從實現插件的類之外。通過這種方式,您可以區分對話窗口的顯示方式(例如,您可以創建一個按鈕來執行show,另一個可以通過調用exec_來顯示它的模式。

+0

謝謝,'exec_'完美無缺! – Searene