不使用Qt Designer将自定义部件嵌入Stacked Widget页面的显示问题
解决PyQt5 StackedWidget无法显示自定义Widget内容的问题
你在对话框的StackedWidget中嵌入两个自定义部件时,程序无报错但部件内容无法显示,核心原因是自定义Widget类的UI初始化逻辑未被执行。
问题根源
你的widget_1_UI和widget_2_UI类虽然继承了QWidget,但仅定义了setupUi方法,实例化时没有调用该方法创建内部控件;同时setupUi的参数Form未关联到Widget自身,导致子控件没有被正确添加到目标Widget上。
解决方案
修改自定义Widget类,确保UI初始化逻辑在实例化时自动执行,以下提供两种实现方式:
方式一:保留setupUi方法,在__init__中调用
修改后的widget_1.py
from PyQt5 import QtCore, QtGui, QtWidgets class widget_1_UI(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) # 将自身传入setupUi,关联控件 def setupUi(self, Form): Form.resize(614, 411) self.verticalLayout = QtWidgets.QVBoxLayout(Form) self.label = QtWidgets.QLabel(Form) font = QtGui.QFont() font.setPointSize(26) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setText("AY YO BBY GRILL") self.verticalLayout.addWidget(self.label) self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setText("Dis one do nuffin") self.verticalLayout.addWidget(self.pushButton)
修改后的widget_2.py
from PyQt5 import QtCore, QtGui, QtWidgets class widget_2_UI(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) def setupUi(self, Form): Form.resize(614, 411) self.verticalLayout = QtWidgets.QVBoxLayout(Form) self.label = QtWidgets.QLabel(Form) font = QtGui.QFont() font.setPointSize(26) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setText("HOW YOU DOIN") self.verticalLayout.addWidget(self.label) self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setText("Dis do nuffin 2") self.verticalLayout.addWidget(self.pushButton)
方式二:直接将UI代码整合到__init__(更简洁)
修改后的widget_1.py
from PyQt5 import QtCore, QtGui, QtWidgets class widget_1_UI(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent) self.resize(614, 411) self.verticalLayout = QtWidgets.QVBoxLayout(self) self.label = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(26) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setText("AY YO BBY GRILL") self.verticalLayout.addWidget(self.label) self.pushButton = QtWidgets.QPushButton(self) self.pushButton.setText("Dis one do nuffin") self.verticalLayout.addWidget(self.pushButton)
修改后的widget_2.py
from PyQt5 import QtCore, QtGui, QtWidgets class widget_2_UI(QtWidgets.QWidget): def __init__(self, parent=None): super().__init__(parent) self.resize(614, 411) self.verticalLayout = QtWidgets.QVBoxLayout(self) self.label = QtWidgets.QLabel(self) font = QtGui.QFont() font.setPointSize(26) self.label.setFont(font) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setText("HOW YOU DOIN") self.verticalLayout.addWidget(self.label) self.pushButton = QtWidgets.QPushButton(self) self.pushButton.setText("Dis do nuffin 2") self.verticalLayout.addWidget(self.pushButton)
主脚本dialog.py无需修改
保持你原来的dialog.py代码不变,运行后StackedWidget就能正常显示两个自定义页面的内容,点击切换按钮也能正常切换页面。
内容的提问来源于stack exchange,提问作者ARChalifour
相关产品推荐
相关产品推荐

