• GUI学习之二十四——QDialog学习总结


    今天学习对话框输入控件的基类(QDialog)。

    一.描述

    是对话类窗口(字体框、颜色选择、文件选择框等)的基类。

    对话框窗口是顶级窗口(就是说不包含于哪个父类的显示界面里),主要用于短期任务和与用户的短期通信。

    QDialogs是可以有返回值的(字体、颜色等),有默认按钮(确认、取消和关闭)。

    二.对话框的种类

      对话框可以是模态或非模态的对话框

      模态对话框也分两种

        应用程序级别(exec()),当该种对话框出现时,用户必须首先对该对话框进行操作,直至关闭后才能访问程序中的其他窗口(注意是访问而不是操作,不关闭时都看不到)。

    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    le = QLineEdit(window)
    window.setWindowTitle('主界面')
    d = QDialog()
    d.setWindowTitle('对话框')
    d.exec()    #注意要在window.show的前面
    window.show()
    sys.exit(app.exec_())

    运行以后会发现弹出了对话框

    看到右上角的按钮了么?注意不是最小化最大化了!是一个提示按钮和关闭按钮。关闭界面以后才能弹出主界面。

    注意并不是对话框把主界面遮盖了,你拖拽也能发现主界面是没有显示的。

        窗口级别(open()),对话框仅仅阻塞与其关联的窗口,用户可和程序内其他窗口交互。就像我们word文件里,打开’打开文件对话框‘,只要对话框不关闭是无法对其进行操作的。因为打开文件对话框和word的窗口是关联的

    我们把上面代码中的exec改成open看看有什么效果

    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    le = QLineEdit(window)
    window.setWindowTitle('主界面')
    d = QDialog()
    d.setWindowTitle('对话框')
    d.open()    #注意要在window.show的前面
    window.show()
    sys.exit(app.exec_())

    运行以后发现可以访问主界面啊

    愿意是因为我们上面讲的,只阻塞和对话框关联的界面,所以我们在声明对话框时应该加上父级控件

    d = QDialog(window)

    这样就无法访问主界面了。

      非模态对话框

        非模态的只有一种状态(show()),在使用中不会阻塞与对话框关联的窗口进行交互,就像word里的查找对话框,对话框即使不关闭也可以对主窗口进行交互。

    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    le = QLineEdit(window)
    window.setWindowTitle('主界面')
    d = QDialog(window)
    d.setWindowTitle('对话框')
    d.show()    #注意要在window.show的前面
    window.show()
    sys.exit(app.exec_())

    这样就可以访问主界面了

    这里要注意一点:在访问主界面的时候对话框是在主界面上面的。两个可以同时操作互不影响。

        非模态的对话框也可以结合下面的语法实现为模态对话框。

    QDialog.setModal(self, modal: bool)

    或者这样

    QDialog.setWindowModality(self, windowModality: QtCore.Qt.WindowModality)
    NonModal = ...  # type: 'Qt.WindowModality'
    WindowModal = ...  # type: 'Qt.WindowModality'
    ApplicationModal = ...  # type: 'Qt.WindowModality'

     三.常用功能作用

    1.是否显示尺寸调整控件

    控件右下角有尺寸调整控件

    QDialog.setSizeGripEnabled(self, a0: bool)
    QDialog.isSizeGripEnabled()

    2.常用槽函数

    QDialog.accept()                #返回值为1
    QDialog.reject()                #返回值为0
    QDialog.done(self, a0: int)     #返回值为设定值

    可以看一下效果

    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    le = QLineEdit(window)
    window.setWindowTitle('主界面')
    d = QDialog(window)
    d.setWindowTitle('对话框')
    btn1 = QPushButton('btn1',d)
    btn1.clicked.connect(lambda :d.accept())
    btn1.move(100,200)
    btn2 = QPushButton('btn2',d)
    btn2.move(250,200)
    btn2.clicked.connect(lambda :d.reject())
    btn3 = QPushButton('btn3',d)
    btn3.move(500,200)
    btn3.clicked.connect(lambda :d.done(123))
    result = d.exec()    #注意要在window.show的前面
    print(result)
    window.show()
    sys.exit(app.exec_())

    点击按钮,可以看出不同的槽有不同的返回值的。

    当然,我们还可以给对话框设定一个返回值

    QDialog.setResult()
    QDialog.result()
    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    le = QLineEdit(window)
    window.setWindowTitle('主界面')
    d = QDialog(window)
    d.setWindowTitle('对话框')
    btn1 = QPushButton('btn1',d)
    btn1.clicked.connect(lambda :d.accept())
    btn1.move(100,200)
    btn2 = QPushButton('btn2',d)
    btn2.move(250,200)
    btn2.clicked.connect(lambda :print(d.result()))     #获取返回值
    btn3 = QPushButton('btn3',d)
    btn3.move(500,200)
    btn3.clicked.connect(lambda :d.setResult(112233))   #设定返回值
    result = d.exec()
    print(result)
    window.show()
    sys.exit(app.exec_())

    如果不设置直接点击btn2的话,默认的返回值为0。并且这个方法是在不关闭对话框的前提下获得返回值。

    四.信号

    和上面的槽对应,有相应的信号

    accept——accepted

    reject——rejected

    done——finished

    结合槽和信号就一个案例说明所有的问题

    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    le = QLineEdit(window)
    window.setWindowTitle('主界面')
    d = QDialog(window)
    d.setWindowTitle('对话框')
    btn1 = QPushButton('btn1',d)
    btn1.clicked.connect(lambda :d.accept())
    d.accepted.connect(lambda :print('btn1 is clicked'))
    btn1.move(100,200)
    btn2 = QPushButton('btn2',d)
    btn2.move(250,200)
    btn2.clicked.connect(lambda :print(d.reject()))     #获取返回值
    d.rejected.connect(lambda :print('btn2 is clicked'))
    btn3 = QPushButton('btn3',d)
    btn3.move(500,200)
    btn3.clicked.connect(lambda :d.done(112233))   #设定返回值
    d.finished.connect(lambda val:print('btn3 is clicked',val))
    result = d.exec()
    print(result)
    window.show()
    sys.exit(app.exec_())

    点击一下各个按钮会发现一个现象:不了点击哪个按钮都会显示btn3被点击,所以说accepted和rejected都会导致finished被调用。

  • 相关阅读:
    感动于细节,记我的一个同学(君君)
    求职时,我问过的问题
    毕业留言,写给我的一个同学
    偶是一个如此善良的人
    温柔地对待仇人,就像对待情人一样!
    小改机箱,支持硬盘调头,让磁盘对拷更方便
    心中的女朋友:(标准)
    准备开始看以下书籍
    成都文化公园游后感
    ”中国的教育与计算机“读后感
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/11042172.html
Copyright © 2020-2023  润新知