You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类的__init__方法中调用方法实现自定义QPushButton组件

解决自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:22:06