目录
一、窗口一闪而逝
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()