059.PyQt5_QDialog_对话窗口基类

QDialog 对话窗口基类

  • 描述
    • 是对话窗口的基类
    • 对话窗口是顶级窗口,主要用于短期任务和与用户的简短通信。
    • 是一个空白的窗口
  • QDialog可能是模态的或非模态对话框
    • 模态对话框
      • 应用程序级别(默认值)
        • 当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口
        • 打开方式:obj.exec()
        • 应用场景:
      • 窗口级别
        • 该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互
        • 打开方式:obj.open()
        • 应用场景:文件选择、是否同意
    • 非模态对话框
      • 不会阻塞与对话框关联的窗口以及与其他窗口进行交互
      • 打开方式:obj.show()
      • 结合 setModal(True) 也可以实现模态对话框
      • 结合 setWindowModality(Qt.WindowModal) 也可以实现模态对话框
        • Qt.WindowModal 设置为窗口级别
        • Qt.ApplicationModal 设置为应用程序级别
      • 应用场景:查找替换
  • QDialogs可以提供返回值,它们可以有默认按钮
  • 继承自:QWidget
  • 功能作用
    • 构造函数

      QDialog(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags())
      
    • 弹出

      exec()                                  # 以应用程序级别模态对话框模式弹出
      open()                                  # 以窗口级别模态对话框模式弹出
      show()                                  # 以非模态对话框模式弹出
      
    • 模态设置

      setModal(bool)                          # 设置对话框是否为窗口级别模态对话框
      
      setWindowModality(Qt.WindowModal)       # 将非模态对话框设置为指定级别的模态对话框
          # 参数:Qt.WindowModal
                  Qt.WindowModal              # 设置为窗口级别
                  Qt.ApplicationModal         # 设置为应用程序级别
          
      modal() -> bool                         # 获取对话框模态
      
      # 一般在show()方法弹出为非模态对话框模式时才使用
      
    • 是否显示尺寸调整控件

      • 右下角多出一个小控件
      setSizeGripEnabled(bool)                # 设置是否显示尺寸调整控件
      
      isSizeGripEnabled() -> bool             # 获取是否设置显示尺寸调整控件
      
    • 常用操作槽函数

      • 通过返回值识别用户的操作
      accept()                                # 确认,返回1
      reject()                                # 取消,返回0
      done(int r)                             # 完成,返回自定义的r
      
      # 在accept()和reject()槽函数中,最后都调用了done()槽函数
      # 在按钮上通过信号连接对应的槽函数,执行对话框的槽函数会触发对应的信号
      
    • 设置和获取数值

      setResult(int)                          # 设置对话框返回值
      
      result() -> int                         # 获取对话框设置的返回值
      
  • 注意:这里的模态设置、添加控件等操作都需要在弹出之前设置好(也就是要在窗口显示之前先设置好,否则窗口已经展示出来了,其他控件或者设置都未调用就无法显示了)
  • 可用信号
    accepted()                                  # 执行accept槽函数时发射该信号
    rejected()                                  # 执行reject槽函数时发射该信号
    finished(int result)                        # 执行done槽函数时发射该信号,并传递返回值
    
    # 由于在accept()和reject()槽函数中,最后都调用了done()槽函数,所以执行三个槽函数都会发射finished()信号
    # 个人测试时发现用exec()弹出应用程序级别模态对话框,执行槽函数时并不会发射信号
    

  • 示例代码
  • 示例1:QDialog-功能作用
    from PyQt5.Qt import *
    import sys
    class MyDialog(QDialog):
        def done(self, a0: int) -> None:
            super(MyDialog, self).done(a0)
            print('执行了done函数')
    
    
    class Windows(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QDialog-功能作用')
            self.resize(500, 500)
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
    
        def add_widget(self):
            # dialog = QDialog(self)
            dialog = MyDialog(self)
            dialog.setWindowTitle('QDialog选择窗口')
    
            # ****************弹出功能****************** 开始
            # dialog.exec()           # 以应用程序级别模态对话框弹出
            # dialog.open()           # 以窗口级别模态对话框弹出
            # dialog.show()           # 以非模态对话框弹出
            # ****************弹出功能****************** 结束
            pass
            # ****************非模态转换为模态对话框****************** 开始
            # dialog.setModal(True)
            # dialog.setWindowModality(Qt.WindowModal)
            # dialog.setWindowModality(Qt.ApplicationModal)
            # dialog.show()
            # ****************非模态转换为模态对话框****************** 结束
            pass
            # ****************设置右下角显示调整大小控件****************** 开始
            # dialog.setSizeGripEnabled(True)
            
            # ****************设置右下角显示调整大小控件****************** 结束
            pass
            # ****************常用操作槽函数****************** 开始
            btn1 = QPushButton(dialog)
            btn1.setText("确定")
            btn1.move(50, 50)
            btn1.clicked.connect(lambda :dialog.accept())
    
            btn2 = QPushButton(dialog)
            btn2.setText("取消")
            btn2.move(50, 100)
            btn2.clicked.connect(lambda: dialog.reject())
    
            btn2 = QPushButton(dialog)
            btn2.setText("自定义")
            btn2.move(50, 150)
            btn2.clicked.connect(lambda val: dialog.done(8))
    
            # result = dialog.open()
            # result = dialog.exec()
            # print(result)
            # ****************常用操作槽函数****************** 结束
            pass
            # ****************设置返回值****************** 开始
            # btn4 = QPushButton(dialog)
            # btn4.setText("设置返回值")
            # btn4.move(50,200)
            # btn4.clicked.connect(lambda :dialog.setResult(888))
            #
            # btn5 = QPushButton(dialog)
            # btn5.setText("打印返回值")
            # btn5.move(50, 250)
            # btn5.clicked.connect(lambda: print(dialog.result()))
            #
            # result = dialog.exec()
            # print(result)
            # ****************设置返回值****************** 结束
            pass
    
            # ****************可用信号****************** 开始
            dialog.open()
            # dialog.show()
            # dialog.exec()           # 应用程序级别模态对话框不发射信号
            dialog.accepted.connect(lambda :print("点击了“确定”按钮"))
            dialog.rejected.connect(lambda :print("点击了“取消”按钮"))
            dialog.finished.connect(lambda val:print("点击了“完成”按钮", val))
            # ****************可用信号****************** 结束
    
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())

你可能感兴趣的:(PyQt5,pyqt5,python,gui,pyqt,python,qt)