实现Windows应用程序之间的切换如何正确?现在看起来不太好。
现在实现的方式:
from PyQt5 import QtCore, QtGui, QtWidgets
# классы Ui отвечают за шаблон графического интерфейса
# ! не изменять, если вы не знаете что вы делаете
class Ui_Win1(object):
def setupUi(self, Win1):
Win1.setObjectName("Win1")
Win1.resize(450, 800)
self.widgetWin1 = QtWidgets.QWidget(Win1)
self.widgetWin1.setObjectName("widgetWin1")
self.text1 = QtWidgets.QLabel(self.widgetWin1)
self.text1.setGeometry(QtCore.QRect(197, 378, 56, 16))
self.text1.setObjectName("text1")
self.bnt = QtWidgets.QPushButton(self.widgetWin1)
self.bnt.setGeometry(QtCore.QRect(0, 772, 150, 28))
self.bnt.setObjectName("bnt")
self.bnt_2 = QtWidgets.QPushButton(self.widgetWin1)
self.bnt_2.setGeometry(QtCore.QRect(150, 772, 150, 28))
self.bnt_2.setObjectName("bnt_2")
self.bnt_3 = QtWidgets.QPushButton(self.widgetWin1)
self.bnt_3.setGeometry(QtCore.QRect(300, 772, 150, 28))
self.bnt_3.setObjectName("bnt_3")
Win1.setCentralWidget(self.widgetWin1)
self.retranslateUi(Win1)
QtCore.QMetaObject.connectSlotsByName(Win1)
def retranslateUi(self, Win1):
_translate = QtCore.QCoreApplication.translate
Win1.setWindowTitle(_translate("Win1", "MainWindow"))
self.text1.setText(_translate("Win1", "Win1"))
self.bnt.setText(_translate("Win1", "1"))
self.bnt_2.setText(_translate("Win1", "2"))
self.bnt_3.setText(_translate("Win1", "3"))
class Ui_Win2(object):
def setupUi(self, Win2):
Win2.setObjectName("Win2")
Win2.resize(450, 800)
self.widgetWin2 = QtWidgets.QWidget(Win2)
self.widgetWin2.setObjectName("widgetWin2")
self.text2 = QtWidgets.QLabel(self.widgetWin2)
self.text2.setGeometry(QtCore.QRect(197, 378, 56, 16))
self.text2.setObjectName("text2")
self.bnt = QtWidgets.QPushButton(self.widgetWin2)
self.bnt.setGeometry(QtCore.QRect(0, 772, 150, 28))
self.bnt.setObjectName("bnt")
self.bnt_2 = QtWidgets.QPushButton(self.widgetWin2)
self.bnt_2.setGeometry(QtCore.QRect(150, 772, 150, 28))
self.bnt_2.setObjectName("bnt_2")
self.bnt_3 = QtWidgets.QPushButton(self.widgetWin2)
self.bnt_3.setGeometry(QtCore.QRect(300, 772, 150, 28))
self.bnt_3.setObjectName("bnt_3")
Win2.setCentralWidget(self.widgetWin2)
self.retranslateUi(Win2)
QtCore.QMetaObject.connectSlotsByName(Win2)
def retranslateUi(self, Win2):
_translate = QtCore.QCoreApplication.translate
Win2.setWindowTitle(_translate("Win2", "MainWindow"))
self.text2.setText(_translate("Win2", "Win2"))
self.bnt.setText(_translate("Win2", "1"))
self.bnt_2.setText(_translate("Win2", "2"))
self.bnt_3.setText(_translate("Win2", "3"))
class Ui_Win3(object):
def setupUi(self, Win3):
Win3.setObjectName("Win3")
Win3.resize(450, 800)
self.widgetWin3 = QtWidgets.QWidget(Win3)
self.widgetWin3.setObjectName("widgetWin3")
self.text3 = QtWidgets.QLabel(self.widgetWin3)
self.text3.setGeometry(QtCore.QRect(197, 378, 56, 16))
self.text3.setObjectName("text3")
self.bnt = QtWidgets.QPushButton(self.widgetWin3)
self.bnt.setGeometry(QtCore.QRect(0, 772, 150, 28))
self.bnt.setObjectName("bnt")
self.bnt_2 = QtWidgets.QPushButton(self.widgetWin3)
self.bnt_2.setGeometry(QtCore.QRect(150, 772, 150, 28))
self.bnt_2.setObjectName("bnt_2")
self.bnt_3 = QtWidgets.QPushButton(self.widgetWin3)
self.bnt_3.setGeometry(QtCore.QRect(300, 772, 150, 28))
self.bnt_3.setObjectName("bnt_3")
Win3.setCentralWidget(self.widgetWin3)
self.retranslateUi(Win3)
QtCore.QMetaObject.connectSlotsByName(Win3)
def retranslateUi(self, Win3):
_translate = QtCore.QCoreApplication.translate
Win3.setWindowTitle(_translate("Win3", "MainWindow"))
self.text3.setText(_translate("Win3", "Win3"))
self.bnt.setText(_translate("Win3", "1"))
self.bnt_2.setText(_translate("Win3", "2"))
self.bnt_3.setText(_translate("Win3", "3"))
# Функциональные классы наследуют виджеты классов Ui
class Win1(QtWidgets.QMainWindow, Ui_Win1):
def __init__(self, parent = None):
super(Win1, self).__init__(parent)
self.setupUi(self)
self.parent = parent
self.stacked = self.parent.stacked
self.bnt.clicked.connect(lambda : self.stacked.setCurrentIndex(0))
self.bnt_2.clicked.connect(lambda : self.stacked.setCurrentIndex(1))
self.bnt_3.clicked.connect(lambda : self.stacked.setCurrentIndex(2))
class Win2(QtWidgets.QMainWindow, Ui_Win2):
def __init__(self, parent = None):
super(Win2, self).__init__(parent)
self.setupUi(self)
self.parent = parent
self.stacked = self.parent.stacked
self.bnt.clicked.connect(lambda : self.stacked.setCurrentIndex(0))
self.bnt_2.clicked.connect(lambda : self.stacked.setCurrentIndex(1))
self.bnt_3.clicked.connect(lambda : self.stacked.setCurrentIndex(2))
class Win3(QtWidgets.QMainWindow, Ui_Win3):
def __init__(self, parent = None):
super(Win3, self).__init__(parent)
self.setupUi(self)
self.parent = parent
self.stacked = self.parent.stacked
self.bnt.clicked.connect(lambda : self.stacked.setCurrentIndex(0))
self.bnt_2.clicked.connect(lambda : self.stacked.setCurrentIndex(1))
self.bnt_3.clicked.connect(lambda : self.stacked.setCurrentIndex(2))
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.stacked = QtWidgets.QStackedWidget(self)
self.setCentralWidget(self.stacked)
self.Window_Win1 = Win1(self)
self.Window_Win2 = Win2(self)
self.Window_Win3 = Win3(self)
self.stacked.addWidget(self.Window_Win1)
self.stacked.addWidget(self.Window_Win2)
self.stacked.addWidget(self.Window_Win3)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.resize(450, 800)
window.show()
sys.exit(app.exec_())
这里在所有功能类中重复相同的设计,这不好,我Ui在所有类中添加按钮以简化设计,代替多个继承,这也不好。
我该如何解决这个问题,我应该怎么做?
界面类:
class Ui_Win1(object):
def setupUi(self, Win1):
Win1.setObjectName("Win1")
Win1.resize(450, 800)
self.widgetWin1 = QtWidgets.QWidget(Win1)
self.widgetWin1.setObjectName("widgetWin1")
self.text1 = QtWidgets.QLabel(self.widgetWin1)
self.text1.setGeometry(QtCore.QRect(197, 378, 56, 16))
self.text1.setObjectName("text1")
Win1.setCentralWidget(self.widgetWin1)
self.retranslateUi(Win1)
QtCore.QMetaObject.connectSlotsByName(Win1)
def retranslateUi(self, Win1):
_translate = QtCore.QCoreApplication.translate
Win1.setWindowTitle(_translate("Win1", "MainWindow"))
self.text1.setText(_translate("Win1", "Win1"))
class Ui_Win2(object):
def setupUi(self, Win2):
Win2.setObjectName("Win2")
Win2.resize(450, 800)
self.widgetWin2 = QtWidgets.QWidget(Win2)
self.widgetWin2.setObjectName("widgetWin2")
self.text2 = QtWidgets.QLabel(self.widgetWin2)
self.text2.setGeometry(QtCore.QRect(197, 378, 56, 16))
self.text2.setObjectName("text2")
Win2.setCentralWidget(self.widgetWin2)
self.retranslateUi(Win2)
QtCore.QMetaObject.connectSlotsByName(Win2)
def retranslateUi(self, Win2):
_translate = QtCore.QCoreApplication.translate
Win2.setWindowTitle(_translate("Win2", "MainWindow"))
self.text2.setText(_translate("Win2", "Win2"))
class Ui_Win3(object):
def setupUi(self, Win3):
Win3.setObjectName("Win3")
Win3.resize(450, 800)
self.widgetWin3 = QtWidgets.QWidget(Win3)
self.widgetWin3.setObjectName("widgetWin3")
self.text3 = QtWidgets.QLabel(self.widgetWin3)
self.text3.setGeometry(QtCore.QRect(197, 378, 56, 16))
self.text3.setObjectName("text3")
Win3.setCentralWidget(self.widgetWin3)
self.retranslateUi(Win3)
QtCore.QMetaObject.connectSlotsByName(Win3)
def retranslateUi(self, Win3):
_translate = QtCore.QCoreApplication.translate
Win3.setWindowTitle(_translate("Win3", "MainWindow"))
self.text3.setText(_translate("Win3", "Win3"))
class Ui_Bnt(object):
def setupUi(self, Bnt):
Bnt.setObjectName("Bnt")
Bnt.resize(450, 800)
self.widgetBnt = QtWidgets.QWidget(Bnt)
self.widgetBnt.setObjectName("widgetBnt")
self.bnt = QtWidgets.QPushButton(self.widgetBnt)
self.bnt.setGeometry(QtCore.QRect(0, 772, 150, 28))
self.bnt.setObjectName("bnt")
self.bnt_2 = QtWidgets.QPushButton(self.widgetBnt)
self.bnt_2.setGeometry(QtCore.QRect(150, 772, 150, 28))
self.bnt_2.setObjectName("bnt_2")
self.bnt_3 = QtWidgets.QPushButton(self.widgetBnt)
self.bnt_3.setGeometry(QtCore.QRect(300, 772, 150, 28))
self.bnt_3.setObjectName("bnt_3")
Bnt.setCentralWidget(self.widgetBnt)
self.retranslateUi(Bnt)
QtCore.QMetaObject.connectSlotsByName(Bnt)
def retranslateUi(self, Bnt):
_translate = QtCore.QCoreApplication.translate
Bnt.setWindowTitle(_translate("Bnt", "MainWindow"))
self.bnt.setText(_translate("Bnt", "1"))
self.bnt_2.setText(_translate("Bnt", "2"))
self.bnt_3.setText(_translate("Bnt", "3"))
注意:不使用 QLayout 和按钮被其他东西替换。
例如,尝试这样:
更新
试试这样: