我一直在尝试通过开发多窗体应用程序来学习,例如,有一个带有菜单的QMainWindow,每个菜单项都打开一个窗体以完成某些功能(即维护客户,维护员工等)。我将QMdiSubWindow用于这些功能,并使用Qt Designer设计表单。
Blow是可供您测试和查看结果的4个工作的.py文件:
main.py(QMainWidow):
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QMdiArea, QMdiSubWindow
from ui_main import Ui_MainWindow
from test import WTest
import sys
class WbmsMain(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.showMaximized()
self.define_menu_action()
def define_menu_action(self):
self.actionTest.triggered.connect(self.menu_test)
self.actionExit.triggered.connect(self.menu_exit_sys)
def menu_exit_sys(self):
button_reply = QMessageBox.question(self, 'WBMS', 'Are you sure you want to exit?',
QMessageBox.Yes | QMessageBox.No)
if button_reply == QMessageBox.Yes:
sys.exit(0)
def menu_test(self):
w_test = WTest()
self.mdiArea.addSubWindow(w_test)
w_test.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
Window = WbmsMain()
Window.show()
app.exec_()
ui_main.py是使用pyuic5生成的:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(2202, 560)
self.centralwidget = QtWidgets.QWidget(MainWindow)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
self.centralwidget.setSizePolicy(sizePolicy)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.mdiArea = QtWidgets.QMdiArea(self.centralwidget)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
self.mdiArea.setBackground(brush)
self.mdiArea.setObjectName("mdiArea")
self.verticalLayout.addWidget(self.mdiArea)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 2202, 22))
self.menubar.setObjectName("menubar")
self.menuSystem = QtWidgets.QMenu(self.menubar)
self.menuSystem.setObjectName("menuSystem")
self.menuMaster_Files = QtWidgets.QMenu(self.menubar)
self.menuMaster_Files.setObjectName("menuMaster_Files")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionCustomer = QtWidgets.QAction(MainWindow)
self.actionExit = QtWidgets.QAction(MainWindow)
self.actionExit.setObjectName("actionExit")
self.actionDestination = QtWidgets.QAction(MainWindow)
self.actionTest = QtWidgets.QAction(MainWindow)
self.actionTest.setObjectName("actionTest")
self.menuSystem.addAction(self.actionExit)
self.menuMaster_Files.addAction(self.actionTest)
self.menubar.addAction(self.menuSystem.menuAction())
self.menubar.addAction(self.menuMaster_Files.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "WBMS 3"))
self.menuSystem.setTitle(_translate("MainWindow", "System"))
self.menuMaster_Files.setTitle(_translate("MainWindow", "Master Files"))
self.actionExit.setText(_translate("MainWindow", "Exit"))
self.actionTest.setText(_translate("MainWindow", "Test"))
ui_test.py也由pyuic5生成:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
Dialog.setMinimumSize(QtCore.QSize(400, 300))
self.widget = QtWidgets.QWidget(Dialog)
self.widget.setGeometry(QtCore.QRect(6, 10, 306, 121))
self.widget.setObjectName("widget")
self.formLayout = QtWidgets.QFormLayout(self.widget)
self.formLayout.setContentsMargins(0, 0, 0, 0)
self.formLayout.setObjectName("formLayout")
self.lineEdit = QtWidgets.QLineEdit(self.widget)
self.lineEdit.setObjectName("lineEdit")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.lineEdit)
self.buttonBox = QtWidgets.QDialogButtonBox(self.widget)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Save|QtWidgets.QDialogButtonBox.SaveAll)
self.buttonBox.setCenterButtons(False)
self.buttonBox.setObjectName("buttonBox")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.buttonBox)
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept)
self.buttonBox.rejected.connect(Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
test.py用于定义从QMdiSubWindow和Ui_Dialog(从ui_test.py)继承的WTest类:
from ui_test import Ui_Dialog
from PyQt5.QtWidgets import QMdiSubWindow
class WTest(QMdiSubWindow, Ui_Dialog):
def __init__(self):
super().__init__()
self.setupUi(self)
def accept(self) -> None:
pass
def reject(self) -> None:
self.close()
但是,当显示WTest时,第一个窗口小部件将与窗口标题栏重叠。我还有另一个UI类,它更复杂(使用StackedWidget),并且MdiSubWindow中什么都没显示。
我的问题是,MdiSubWindow是执行此操作的正确方法,还是Qt Designer问题?
谢谢。