一个完整的项目一般都是由多个窗口组成的,因此掌握创建并成功实现多窗口是十分重要的。
在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_())
成功打开其余的三个窗口