• Pyqt show和exec的区别


    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_() 方法

     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_())

    效果:

  • 相关阅读:
    codeforces707B:Bakery
    codeforces707A:Brain's Photos
    BZOJ1084 [SCOI2005]最大子矩阵
    BZOJ1264 [AHOI2006]基因匹配Match
    BZOJ2764 [JLOI2011]基因补全
    codevs1257 打砖块
    BZOJ1079 [SCOI2008]着色方案
    BZOJ1026 [SCOI2009]windy数
    菜鸟学自动化测试(一)----selenium IDE
    关于w3school的html5部分output 元素实例代码(点亲自试一试进去)的问题纠正
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4586373.html
Copyright © 2020-2023  润新知