多种形式的PyQt5应用程序

时间:2019-12-16 09:37:50

标签: python pyqt pyqt5

我一直在尝试通过开发多窗体应用程序来学习,例如,有一个带有菜单的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问题?

谢谢。

0 个答案:

没有答案