如何在类的__init__方法中调用方法实现自定义QPushButton组件
你的代码核心问题是:自定义的CategoryButton本身继承了QPushButton,但Draw方法却新建了一个全新的QPushButton并返回,导致你实例化的CategoryButton对象本身没有任何布局内容,只有调用Draw()返回的那个新按钮才带图标和文字。
直接修改Draw方法,让它直接在当前CategoryButton实例上构建布局,而不是创建新按钮,就能解决问题:
import sys from PySide6.QtWidgets import QApplication from PySide6.QtWidgets import QPushButton, QLabel, QHBoxLayout from PySide6.QtGui import QPixmap class CategoryButton(QPushButton): def __init__(self, icon: QPixmap, text: str) -> None: super().__init__() self._icon = icon self._text = text self.Draw() def Draw(self) -> None: button_layout = QHBoxLayout(self) # 直接把布局绑定到当前实例self上 label_icon = QLabel() label_text = QLabel(self._text) label_icon.setPixmap(self._icon) button_layout.addWidget(label_icon) button_layout.addStretch(1) button_layout.addWidget(label_text) button_layout.addStretch(1) # 不需要新建QPushButton,也不需要返回值 def main(): app = QApplication(sys.argv) app.setStyle('Fusion') # 现在直接实例化后show即可,不用调用Draw() h = CategoryButton(QPixmap("app/src/view/assets/icons/account.svg"), "account") h.show() sys.exit(app.exec()) if __name__ == "__main__": main()
关键修改点:
Draw方法里的QHBoxLayout直接传入self作为父控件,这样布局会直接应用到当前CategoryButton实例上- 删除了新建
QPushButton的代码,因为当前类本身就是QPushButton的子类,不需要额外创建 - 修改
Draw方法的返回类型为None,因为不再需要返回新按钮
这样修改后,你实例化CategoryButton时,__init__里调用的Draw()会直接把图标、文字和布局设置到当前按钮上,不需要再手动调用Draw(),完全符合PySide的组件开发风格。
内容的提问来源于stack exchange,提问作者averagejoe
相关产品推荐
相关产品推荐

