Qt第四十四章:弹出窗口

冷不防 2024-03-30 11:02 214阅读 0赞

目录

一、窗口一闪而逝

二、弹出窗口

三、多窗口弹出

四、模态

五、局部模态


一、窗口一闪而逝

  1. import sys
  2. from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget
  3. if __name__ == '__main__':
  4. app = QApplication([])
  5. # 窗口一
  6. window = QMainWindow()
  7. button = QPushButton(window)
  8. button.setText('点击')
  9. def handle_button():
  10. # 窗口二
  11. widget = QWidget()
  12. widget.resize(200, 300)
  13. widget.show()
  14. button.clicked.connect(handle_button)
  15. window.show()
  16. sys.exit(app.exec())

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

二、弹出窗口

  1. import sys
  2. from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget
  3. if __name__ == '__main__':
  4. app = QApplication([])
  5. # 窗口一
  6. window = QMainWindow()
  7. button = QPushButton(window)
  8. button.setText('点击')
  9. def handle_button():
  10. # 窗口二、将窗口句柄赋值到window窗口的属性中,只要window对象属性不被销毁,窗口二就可以一直存在。
  11. window.widget = QWidget()
  12. window.widget.resize(200, 300)
  13. window.widget.show()
  14. button.clicked.connect(handle_button)
  15. window.show()
  16. sys.exit(app.exec())

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

三、多窗口弹出

  1. import sys
  2. from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget
  3. if __name__ == '__main__':
  4. app = QApplication([])
  5. # 窗口一
  6. window = QMainWindow()
  7. button = QPushButton(window)
  8. button.setText('弹出窗口')
  9. button2 = QPushButton(window)
  10. button2.setGeometry(0, 50, 100, 30)
  11. button2.setText('销毁弹窗')
  12. def handle_button():
  13. # 窗口二、
  14. widget = QWidget()
  15. widget.resize(200, 300)
  16. widget.show()
  17. # 将窗口句柄赋值到window窗口的属性中,只有window对象属性不被销毁,窗口二就可以一直存在。
  18. if not hasattr(window, 'widgets'):
  19. window.widgets = []
  20. window.widgets.append(widget)
  21. button.clicked.connect(handle_button)
  22. def handle_button2():
  23. del window.widgets
  24. button2.clicked.connect(handle_button2)
  25. window.show()
  26. sys.exit(app.exec())

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

四、模态

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

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

五、局部模态

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

发表评论

表情:
评论列表 (有 0 条评论,214人围观)

还没有评论,来说两句吧...

相关阅读