当前位置: 代码迷 >> 综合 >> [PYQT5] 主窗口弹出子窗口
  详细解决方案

[PYQT5] 主窗口弹出子窗口

热度:86   发布时间:2024-01-26 05:55:52.0

 需求:

在PYQT5中,点击主窗口中的按钮,弹出子窗口。

测试代码:

例1:

在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象赋值到普通变量,并调用其 show 方法。

from PyQt5.QtWidgets import *
import sysclass Main(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("主窗口")button = QPushButton("弹出子窗", self)button.clicked.connect(self.show_child)def show_child(self):child_window = Child()child_window.show()class Child(QWidget):def __init__(self):super().__init__()self.setWindowTitle("我是子窗口啊")# 运行主窗口
if __name__ == "__main__":app = QApplication(sys.argv)window = Main()window.show()sys.exit(app.exec_())

运行结果: 该段代码运行后,点击主窗口中的按钮,子窗口一闪而过。

例2:

在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象并赋值为对象属性,并调用其 show 方法。

from PyQt5.QtWidgets import *
import sysclass Main(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("主窗口")button = QPushButton("弹出子窗", self)button.clicked.connect(self.show_child)def show_child(self):self.child_window = Child()self.child_window.show()class Child(QWidget):def __init__(self):super().__init__()self.setWindowTitle("我是子窗口啊")# 运行主窗口
if __name__ == "__main__":app = QApplication(sys.argv)window = Main()window.show()sys.exit(app.exec_())

运行结果: 该段代码运行后,点击主窗口中的按钮,子窗口正常打开,重复点击按钮,子窗口重复弹出。

例3:

主窗口__init__方法中创建子窗口对象并赋值为对象属性,添加按钮,并把按钮信号关联槽,在槽函数中调用子窗口对象的 show 方法。

from PyQt5.QtWidgets import *
import sysclass Main(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("主窗口")button = QPushButton("弹出子窗", self)button.clicked.connect(self.show_child)self.child_window = Child()def show_child(self):self.child_window.show()class Child(QWidget):def __init__(self):super().__init__()self.setWindowTitle("我是子窗口啊")# 运行主窗口
if __name__ == "__main__":app = QApplication(sys.argv)window = Main()window.show()sys.exit(app.exec_())

运行结果: 重复点击按钮,子窗口不重复弹出。

结论:

例2比例1仅仅多了一个self怎么就运行正常了呢?

  • 例1中 子窗口对象为 方法中普通的变量,当方法运行完后,python的机制就把变量销毁了,故子窗口一闪而过;
  • 例2中 子窗口对象为 主窗口对象的变量,当方法运行完后,主窗口对象依旧存在,故子窗口正常显示,但是每一次运行槽函数都会重新创建子窗口对象;
  • 例3中 子窗口对象为 主窗口对象的变量,当方法运行完后,主窗口对象依旧存在,故子窗口正常显示,每一次运行槽函数只会重新调用子窗口对象;

 

欢迎批评指教。