美文网首页
PySide2学习记录(十):对话框

PySide2学习记录(十):对话框

作者: 3ni | 来源:发表于2018-11-28 13:45 被阅读0次

    Python版本3.7
    PySide2 Version: 5.14.1
    官方文档:http://doc.qt.io/qtforpython/index.html

    前面讨论了消息对话框和文件对话框,其实QT还为我们提供其它对话框,比如颜色选择的对话框,打印对话框等等,使用方法都是大同小异,一个是通过类的静态方法,另一个是通过实例对象。这些对话框都属于QDialog类的子类,所以,了解一下QDialog可以更好的掌握这些对话框。

    对话框一般有两种对话框,一是模式(模态)对话框,另一种是非模式(非模态)对话框,然而在模式对话框下,又有两种情况,一是应用程序模式,另一种是窗口模式。对于模式对话框,它的特点是会阻塞其它窗口的交互,必须先完成当前对话框的交互才能进行其它窗口的交互。在应用程序模式下,模式对话框会阻塞同一个应用程序下其它所有窗口的交互,直到用户关闭对话框,而在窗口模式下,它只会阻塞它父窗口的交互。默认情况下,对话框被设置为应用程序模式对话框。非模式对话框不会阻塞其它窗口,它是独立于同一应用程序的窗口。

    开启一个模式对话框最常用的方式就是调用exec_()函数(注意调用exec_()会立即阻塞,即后面的代码不会执行,直到exec_函数返回),当用户关闭模式对话框时,exec_()会返回一个值。但是官网手册建议我们使用open()函数,这个并不会立即阻塞,它会异步执行,会执行完后面的代码,结果我测试使用open()函数,为啥显示的对话框不是个完整的对话框,不知道是怎么回事。开启一个非模式对话框可以调用show()函数,但是在显示之前还需要设置一下,调用setModal(False),用于设置对话框类型,毕竟show()函数只是一个显示函数。到这里其实如果自己多尝试一下就会有新的发现。

    执行以下代码:

    messagebox = QMessageBox(parent)
    messagebox.setText('content')
    # 也可以不写这一行,因为默认就是模式对话框
    messagebox.setModal(True)
    # 不调用exec_()
    messagebox.show()
    print('after')
    

    你会发现,这个消息对话框是模式对话框,并且执行了print函数,如果调用exec_这个函数的话,就不会执行print,所以是不是可以使用这个方法来代替open()函数呢,暂不知道有什么影响,慎用。

    QDialog中还有几个信号和函数值得了解。
    三个信号分别是finished(result)accepted()rejected()
    三个函数分别是done(arg_1)accept()reject()
    调用accept()reject()的效果是隐藏模式对话框,然后将返回值设置为AcceptedRejected
    调用done(arg_1)是关闭对话框,并将返回值设置为arg_1,并发送finished(result)信号,result就是arg_1,如果result是AcceptedRejected将会发送accepted()rejected()信号。

    以下以QMessageBox为例子

    from PySide2.QtWidgets import QWidget, QPushButton, QApplication, QMessageBox, QGridLayout
    from PySide2.QtCore import Signal, Slot
    
    
    class MyWidget(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.btn_dialog01 = QPushButton('打开模式对话框01')
            self.btn_dialog01.clicked.connect(self.openMessageBox01)
            self.btn_dialog02 = QPushButton('打开非模式对话框02')
            self.btn_dialog02.clicked.connect(self.openMessageBox02)
            self.btn_dialog03 = QPushButton('打开模式对话框03')
            self.btn_dialog03.clicked.connect(self.openMessageBox03)
    
            self.layout = QGridLayout()
            self.layout.addWidget(self.btn_dialog01, 1, 1)
            self.layout.addWidget(self.btn_dialog02, 1, 2)
            self.layout.addWidget(self.btn_dialog03, 1, 3)
            self.setLayout(self.layout)
    
        @Slot()
        def openMessageBox01(self):
            messagebox = QMessageBox(self)
            messagebox.setText('content01')
            messagebox.exec_()
            print('after01')
    
        @Slot()
        def openMessageBox02(self):
            messagebox = QMessageBox(self)
            messagebox.setText('content02')
            messagebox.setModal(False)
            messagebox.show()
            print('after02')
    
        @Slot()
        def openMessageBox03(self):
            messagebox = QMessageBox(self)
            messagebox.setText('content03')
            messagebox.show()
            print('after03')
    
    
    app = QApplication()
    widget = MyWidget()
    widget.show()
    app.exec_()
    
    

    运行截图:

    图1

    友情链接:
    QDialog

    相关文章

      网友评论

          本文标题:PySide2学习记录(十):对话框

          本文链接:https://www.haomeiwen.com/subject/fucyqqtx.html