Qt第四十四章:弹出窗口

目录

一、窗口一闪而逝

二、弹出窗口

三、多窗口弹出

四、模态

五、局部模态


一、窗口一闪而逝

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget

if __name__ == '__main__':
    app = QApplication([])

    # 窗口一
    window = QMainWindow()
    button = QPushButton(window)
    button.setText('点击')


    def handle_button():
        # 窗口二
        widget = QWidget()
        widget.resize(200, 300)
        widget.show()


    button.clicked.connect(handle_button)

    window.show()
    sys.exit(app.exec())

 为什么子窗口会一闪而逝呢?因为是在槽函数中创建的窗口对象,函数执行完毕后,窗口对象就   会被销毁。

二、弹出窗口

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget

if __name__ == '__main__':
    app = QApplication([])

    # 窗口一
    window = QMainWindow()
    button = QPushButton(window)
    button.setText('点击')


    def handle_button():
        # 窗口二、将窗口句柄赋值到window窗口的属性中,只要window对象属性不被销毁,窗口二就可以一直存在。
        window.widget = QWidget()
        window.widget.resize(200, 300)
        window.widget.show()


    button.clicked.connect(handle_button)

    window.show()
    sys.exit(app.exec())

弹出子窗口的时候,将句柄赋值到window窗口的属性中,只要window对象属性不被销毁,窗口二就可以一直存在。(销毁对象不等于销毁对象属性,我们以上的赋值方式,并不能被对象的__delattr__方法侦测到)

三、多窗口弹出

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget

if __name__ == '__main__':
    app = QApplication([])

    # 窗口一
    window = QMainWindow()
    button = QPushButton(window)
    button.setText('弹出窗口')
    button2 = QPushButton(window)
    button2.setGeometry(0, 50, 100, 30)
    button2.setText('销毁弹窗')


    def handle_button():
        # 窗口二、
        widget = QWidget()
        widget.resize(200, 300)
        widget.show()

        # 将窗口句柄赋值到window窗口的属性中,只有window对象属性不被销毁,窗口二就可以一直存在。
        if not hasattr(window, 'widgets'):
            window.widgets = []
        window.widgets.append(widget)


    button.clicked.connect(handle_button)


    def handle_button2():
        del window.widgets


    button2.clicked.connect(handle_button2)

    window.show()
    sys.exit(app.exec())

这里要注意,弹出多窗口后,叉除窗口只是销毁了window对象,对象属性还未销毁(我们以上的赋值方式,并不能被对象的__delattr__方法侦测到)。只有真正del掉了或者重新进行了赋值,才算是。销毁了对象属性。

四、模态

widget.setWindowModality(Qt.ApplicationModal)
widget.show()

在窗口show之前设置一下即可。widget.setWindowModality(Qt.ApplicationModal)

五、局部模态


widget.setWindowFlags(widget.windowFlags() | Qt.Window)
widget.setParent(被模态的QWidget)
widget.setWindowModality(Qt.WindowModal)
widget.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值