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_())
效果: