我想用另一个类的小部件替换一个类的小部件。
即删除所有小部件对象,并在 widget 中centralwidget1
声明所有小部件对象。centralwidget2centralwidget1
我尝试引用Ui_MainWindow2小部件类centralwidget2并在小部件中声明所有小部件对象centralwidget2,centralwidget1我也尝试继承小部件
我设法创建了一个新窗口并关闭了旧窗口。这也可以通过更改对象本身的内容来完成,但我想在一个类中编写所有逻辑并从其他类继承小部件。
编码 :
class Ui_MainWindow1(object):
def setupUi(self, MainWindow1):
MainWindow1.setObjectName("MainWindow1")
MainWindow1.resize(400, 400)
self.centralwidget1 = QtWidgets.QWidget(MainWindow1)
self.centralwidget1.setObjectName("centralwidget1")
self.pushButton1 = QtWidgets.QPushButton(self.centralwidget1)
self.pushButton1.setGeometry(QtCore.QRect(153, 252, 94, 29))
self.pushButton1.setObjectName("pushButton1")
self.label1 = QtWidgets.QLabel(self.centralwidget1)
self.label1.setGeometry(QtCore.QRect(172, 118, 56, 17))
self.label1.setObjectName("label1")
MainWindow1.setCentralWidget(self.centralwidget1)
self.retranslateUi(MainWindow1)
QtCore.QMetaObject.connectSlotsByName(MainWindow1)
def retranslateUi(self, MainWindow1):
_translate = QtCore.QCoreApplication.translate
MainWindow1.setWindowTitle(_translate("MainWindow1", "MainWindow"))
self.pushButton1.setText(_translate("MainWindow1", "Кнопка 1"))
self.label1.setText(_translate("MainWindow1", "Окно 1"))
class Ui_MainWindow2(object):
def setupUi(self, MainWindow2):
MainWindow2.setObjectName("MainWindow2")
MainWindow2.resize(400, 400)
self.centralwidget2 = QtWidgets.QWidget(MainWindow2)
self.centralwidget2.setObjectName("centralwidget2")
self.pushButton2 = QtWidgets.QPushButton(self.centralwidget2)
self.pushButton2.setGeometry(QtCore.QRect(153, 252, 94, 29))
self.pushButton2.setObjectName("pushButton2")
self.label2 = QtWidgets.QLabel(self.centralwidget2)
self.label2.setGeometry(QtCore.QRect(172, 118, 56, 17))
self.label2.setObjectName("label2")
MainWindow2.setCentralWidget(self.centralwidget2)
self.retranslateUi(MainWindow2)
QtCore.QMetaObject.connectSlotsByName(MainWindow2)
def retranslateUi(self, MainWindow2):
_translate = QtCore.QCoreApplication.translate
MainWindow2.setWindowTitle(_translate("MainWindow2", "MainWindow"))
self.pushButton2.setText(_translate("MainWindow2", "Кнопка 2"))
self.label2.setText(_translate("MainWindow2", "Окно 2"))
class Ui_MainWindow3(object):
def setupUi(self, MainWindow3):
MainWindow3.setObjectName("MainWindow3")
MainWindow3.resize(400, 400)
self.centralwidget3 = QtWidgets.QWidget(MainWindow3)
self.centralwidget3.setObjectName("centralwidget3")
self.pushButton3 = QtWidgets.QPushButton(self.centralwidget3)
self.pushButton3.setGeometry(QtCore.QRect(153, 252, 94, 29))
self.pushButton3.setObjectName("pushButton3")
MainWindow3.setCentralWidget(self.centralwidget3)
self.retranslateUi(MainWindow3)
QtCore.QMetaObject.connectSlotsByName(MainWindow3)
def retranslateUi(self, MainWindow3):
_translate = QtCore.QCoreApplication.translate
MainWindow3.setWindowTitle(_translate("MainWindow3", "MainWindow"))
self.pushButton3.setText(_translate("MainWindow3", "Кнопка 3"))
class MainWindow3(QtWidgets.QMainWindow, Ui_MainWindow3):
def __init__(self, parent = None):
super().__init__()
self.setupUi(self)
self.parent = parent
class MainWindow2(QtWidgets.QMainWindow, Ui_MainWindow2):
def __init__(self, parent = None):
super().__init__()
self.setupUi(self)
self.parent = parent
self.window3 = MainWindow3(self)
self.pushButton2.clicked.connect(self.create_win3)
def create_win3(self):
self.hide()
self.window3.show()
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow1):
def __init__(self):# --- (self, centralwidget2) < --- хотел попробовать унаследовать виджет (centralwidget2) чтобы потом обявить в виждете (self.centralwidget1)
super().__init__()
self.setupUi(self)
self.window2 = MainWindow2(self)
self.pushButton1.clicked.connect(self.create_win2)
def create_win2(self):
self.hide()# --- self.centralwidget1.setHiden(True) < --- удалит все обьекты виджета (self.centralwidget1)
self.window2.show()# --- Ui_MainWindow2.centralwidget2(self.centralwidget1) < --- хотел попробовать обратиться к виджету (centralwidget2) и обявить в виждете (self.centralwidget1)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
Window1 = MainWindow()
Window1.show()
sys.exit(app.exec_())

您的想法的一个可能解决方案是使用QStackedWidget小部件。
该类
QStackedWidget提供了一个小部件堆栈,其中一次只有一个小部件可见。