PyQt5中解决无法打开创建的多窗口问题

一个完整的项目一般都是由多个窗口组成的,因此掌握创建并成功实现多窗口是十分重要的。

在Qt Designer中通过连续新建窗口来实现创建多窗口,但是连续创建的窗口不够直观,因此需要我们通过简单的拖拽让其更加直观。并且需要将创建的每一个窗口都要保存(最好保存到自己代码运行的根目录下)。

以下示例主要内容为通过“打开”按钮来打开其他三个窗口。

为了直观一点,我先将错误代码示范完整的粘贴到下面。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow


class Ui_MainWindow(QMainWindow):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(285, 239)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(90, 80, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 285, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(self.open)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "打开"))

    def open(self):
        import untitled2, untitled3, untitled4
        self.ui = Ui_MainWindow()  # 创建第一个窗体对象
        self.second = untitled2.Ui_MainWindow()  # 创建第二个窗体对象
        self.second.show()
        self.third = untitled3.Ui_MainWindow()
        self.third.show()
        self.fourth = untitled4.Ui_MainWindow()
        self.fourth.show()

    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        self.setupUi(self)  # 初始化窗口设置


import sys

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

与单窗口不同的是,打开多窗口需要额外增加一个open函数,从而分别打开另外三个窗口。上述代码诈一看好像没有什么问题,在open函数中,从依次创建窗口对象到显示窗口,似乎都在按部就班的完成任务。但一运行代码,好像离我们的预想差的很远。运行结果如下:

在弹出的窗口中点击“打开”,此时无法打开另外三个窗口。到底为什么呢?

再次观察open函数,发现untitled2, untitled3, untitled4的UI类都是相同的,这样显然会引起冲突,并且每个untitledX都有自己对应的.py文件,正确的做法应当是调用自己的UI_MainWindow类,同时为了保证唯一性,该类的命名也许做出改变。

self.second = QtWidgets.QMainWindow()
self.ui2 = untitled2.Ui_MainWindow2()
self.ui2.setupUi(self.second)
self.second.show()

修改的思路与初始化一个窗口类似,只是为每个导入的UI类创建了单独的QMainWindow实例,并且避免了命名冲突。

正确代码如下

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow


class Ui_MainWindow(QMainWindow):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(285, 239)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(90, 80, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 285, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(self.open)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "打开"))

    def open(self):
        import untitled2
        import untitled3
        import untitled4
        self.second = QtWidgets.QMainWindow()  # 创建第一个窗体对象
        self.ui2 = untitled2.Ui_MainWindow2()
        self.ui2.setupUi(self.second)
        self.second.show()

        self.third = QtWidgets.QMainWindow()
        self.ui3 = untitled3.Ui_MainWindow3()
        self.ui3.setupUi(self.third)
        self.third.show()

        self.fourth = QtWidgets.QMainWindow()
        self.ui4 = untitled4.Ui_MainWindow4()
        self.ui4.setupUi(self.fourth)
        self.fourth.show()

    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        self.setupUi(self)  # 初始化窗口设置


import sys

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

成功打开其余的三个窗口

PyQt5,如果你尝试点击按钮打开一个新的窗口,但程序却闪退,这可能是由于以下几个常见原因: 1. **缺少初始化**:确保在创建窗口对象之前已经完成了`QApplication`的初始化。 ```python import sys from PyQt5.QtWidgets import QApplication, QWidget app = QApplication(sys.argv) window = QWidget() # 先创建窗口对象,再显示 window.showMaximized() sys.exit(app.exec_()) ``` 2. **窗口创建错误**:确保窗口对象正确构造并且添加到了应用程序。 3. **内存泄漏**:如果你打开了大量窗口而没有关闭,可能会导致内存溢出。记得在不再需要窗口时调用`close()`或`deleteLater()`方法释放资源。 4. **权限问题**:确保运行该脚本的用户有足够的权限创建新的窗口。 5. **异常处理不当**:未捕获或处理可能出现的异常可能导致闪退。例如,如果某个操作失败,应使用`try/except`来处理错误。 6. **窗口生命周期管理**:确保你在合适的时候调用了`show()`、`exec_()`等方法,特别是在主线程。 如果你提供具体的代码片段,我可以更准确地帮助你定位问题。如果你需要创建窗口,可以参考以下示例: ```python from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.btn_open_window = QPushButton('Open New Window') self.btn_open_window.clicked.connect(self.open_new_window) self.setCentralWidget(self.btn_open_window) def open_new_window(self): new_window = SecondWindow(parent=self) # 创建窗口,并指定父窗口为self new_window.show() # 其他窗口类... class SecondWindow(QMainWindow): def __init__(self, parent=None): super(SecondWindow, self).__init__(parent=parent) # 窗口内容设置... if __name__ == '__main__': app = QApplication(sys.argv) main_win = MainWindow() main_win.showMaximized() sys.exit(app.exec_()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值