Pyqt中 QDialog  show和exec的区别

QDialog的显示有两个函数show()和exec()。他们的区别在参考文档上的解释如下:

show():
显示一个非模式对话框。控制权即刻返回给调用函数。
弹出窗口是否模式对话框,取决于modal属性的值。

原文: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.

模式与非模式

模式对话框,就是在弹出窗口的时候,整个程序就被锁定了,处于等待状态,直到对话框被关闭。这时往往是需要对话框的返回值进行下面的操作。如:确认窗口(选择“是”或“否”)。
非模式对话框,在调用弹出窗口之后,调用即刻返回,继续下面的操作。这里只是一个调用指令的发出,不等待也不做任何处理。如:查找框。

简单的理解:

首先这两个方法返回值不同。exec()有返回值,show()没有返回值。

其次这两个方法的作用也不同。调用show()的作用仅仅是将widget及其上的内容都显示出来,控制权即刻返回给调用函数。而调用exec()后,调用线程将会被阻塞,锁住程序直到用户关闭该对话框,期间用户不可以切换同程序下的其它窗口直到Dialog关闭。

在举一个父类点击事件弹层QDialog子窗体的例子

父类实例化子类 直接用.show()方法闪退, 所以要实例化为父类的全局变量 or 执行exec_() 方法

 #!/usr/bin/python
# -*- coding: utf-8 -*-
from PyQt4 import QtCore
from PyQt4.QtGui import *
import sys class W1(QWidget):
def __init__(self, parent=None):
super(W1, self).__init__(parent)
self.btn = QPushButton('Click1') vb = QVBoxLayout()
vb.addWidget(self.btn)
self.setLayout(vb) self.btn.clicked.connect(self.fireupWindows2) def fireupWindows2(self):
w2 = W2() # w2= W2(self) 在父类基础self弹框
w2.show() # Dialog show() 直接闪退 # 需要通过self实例化为全局变量,不加self的话,一运行就被回收,也就无法显示。
self.w2 = W2()
self.w2.show() # 或者 直接exec_() Dialog 可执行exec_() 方法, Widget 没有exec_()方法
w2 = W2()
w2.exec_() # app.exec_()--------------消息循环结束之后,进程自然也会结束 class W2(QDialog):
def __init__(self, parent=None):
super(W2, self).__init__(parent) self.btn = QPushButton('Click2') vb = QVBoxLayout()
vb.addWidget(self.btn)
self.setLayout(vb) self.btn.clicked.connect(self.fireupWindows3) def fireupWindows3(self):
self.accept() if __name__ == "__main__":
app = QApplication(sys.argv)
w = W1()
w.show()
sys.exit(app.exec_())

效果:

最新文章

  1. 简单事件机制Java实现
  2. xp
  3. win8安装SQL Server2008企业版
  4. yii2知识点理解(成员属性)
  5. NRF51822之GPIOTE使用
  6. java处理日期时间
  7. bzoj1876: [SDOI2009]SuperGCD
  8. js定时器window.setTimeout和setInterval
  9. javascript 常用array类型方法
  10. bigdata_hadoop_namenode手动重启错误解决分析
  11. QTableWidget
  12. JAVA中handleEvent和action的区别
  13. Layui treeGrid
  14. Linux_修改hosts
  15. hdu-4180-exgcd
  16. Python正则表达式使用
  17. Windows 2012 R2 创建AD域
  18. Java编程题每日一练day1
  19. php将汉字转换为拼音和得到词语首字母(一)
  20. shell编程技巧和陷阱

热门文章

  1. android MVC && MVP && MVVM分析和对比
  2. Leetcode 230. Kth Smallest Element in a BST
  3. Hbase集群master.HMasterCommandLine: Master exiting
  4. JDK小Bug汇总
  5. Map工具系列-04-SQL合并执行工具
  6. Beta阶段第三次Scrum Meeting
  7. ngInclude与script加载模板
  8. 数据存储_SQLite常用的函数
  9. Spring系列之谈谈对Spring IOC的理解
  10. 1JavaEE应用简介----青软S2SH(笔记)