Pyqt show和exec的區別

Pyqt中 QDialog  show和exec的區別python

QDialog的顯示有兩個函數show()和exec()。他們的區別在參考文檔上的解釋以下:app

show():
顯示一個非模式對話框。控制權即刻返回給調用函數。
彈出窗口是否模式對話框,取決於modal屬性的值。less

原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code. 
The dialog will be modal or modeless according to the value of the modal property.函數

exec():
顯示一個模式對話框,而且鎖住程序直到用戶關閉該對話框爲止。函數返回一個DialogCode結果。
在對話框彈出期間,用戶不能夠切換同程序下的其它窗口,直到該對話框被關閉。
原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result. 
Users cannot interact with any other window in the same application until they close the dialog. ui

 

模式與非模式spa

模式對話框,就是在彈出窗口的時候,整個程序就被鎖定了,處於等待狀態,直到對話框被關閉。這時每每是須要對話框的返回值進行下面的操做。如:確認窗口(選擇「是」或「否」)。
非模式對話框,在調用彈出窗口以後,調用即刻返回,繼續下面的操做。這裏只是一個調用指令的發出,不等待也不作任何處理。如:查找框。線程

 

簡單的理解:code

首先這兩個方法返回值不一樣。exec()有返回值,show()沒有返回值。blog

其次這兩個方法的做用也不一樣。調用show()的做用僅僅是將widget及其上的內容都顯示出來,控制權即刻返回給調用函數。而調用exec()後,調用線程將會被阻塞,鎖住程序直到用戶關閉該對話框,期間用戶不能夠切換同程序下的其它窗口直到Dialog關閉。進程

 

 

在舉一個父類點擊事件彈層QDialog子窗體的例子

父類實例化子類 直接用.show()方法閃退, 因此要實例化爲父類的全局變量 or 執行exec_() 方法

 

 1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 from PyQt4 import QtCore
 4 from PyQt4.QtGui import *
 5 import sys
 6 
 7 
 8 class W1(QWidget):
 9     def __init__(self, parent=None):
10         super(W1, self).__init__(parent)
11         self.btn = QPushButton('Click1')
12 
13         vb = QVBoxLayout()
14         vb.addWidget(self.btn)
15         self.setLayout(vb)
16 
17         self.btn.clicked.connect(self.fireupWindows2)
18 
19     def fireupWindows2(self):
20         w2 = W2()  # w2= W2(self) 在父類基礎self彈框
21         w2.show()  # Dialog show()  直接閃退
22 
23         # 須要經過self實例化爲全局變量,不加self的話,一運行就被回收,也就沒法顯示。
24         self.w2 = W2()
25         self.w2.show()
26 
27         # 或者 直接exec_()   Dialog 可執行exec_() 方法, Widget 沒有exec_()方法
28         w2 = W2()
29         w2.exec_()  # app.exec_()--------------消息循環結束以後,進程天然也會結束
30 
31 
32 class W2(QDialog):
33     def __init__(self, parent=None):
34         super(W2, self).__init__(parent)
35 
36         self.btn = QPushButton('Click2')
37 
38         vb = QVBoxLayout()
39         vb.addWidget(self.btn)
40         self.setLayout(vb)
41 
42         self.btn.clicked.connect(self.fireupWindows3)
43 
44     def fireupWindows3(self):
45         self.accept()
46 
47 
48 if __name__ == "__main__":
49     app = QApplication(sys.argv)
50     w = W1()
51     w.show()
52     sys.exit(app.exec_())

 

效果:

相關文章
相關標籤/搜索