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

PyQt自定义QPushButton类实例显示在独立窗口,如何绑定到主Window对象

问题解决方法

出现两个独立窗口是两个代码逻辑问题共同导致的:

  • 你自定义的ButtonClass已经继承了QPushButton,但类内部又额外创建了一个独立的QPushButton实例self.button,相当于一个类里同时存在两个按钮控件
  • 所有没有指定父控件(Parent)的QWidget子类实例,都会默认作为独立窗口显示,你的ButtonClass实例和内部的self.button都没有绑定父控件,就会出现两个独立窗口

修改步骤

1. 重构ButtonClass类

删掉冗余的内部按钮实例,所有属性直接设置到类本身,同时新增parent参数传递给父类构造:

class ButtonClass(QPushButton):
    # 新增parent参数,默认设为None适配不同使用场景
    def __init__(self, set_image, set_button_geometry, set_button_resize, set_button_visible, parent=None):
        # 把parent传给父类构造,完成控件绑定
        super().__init__(parent=parent)

        # 实例变量通过参数赋值
        self.set_image = set_image
        self.set_button_geometry = set_button_geometry
        self.set_button_resize = set_button_resize
        self.set_button_visible = set_button_visible

        # 直接调用属性设置方法
        self.button_attributes()

    def button_attributes(self):
        # 所有属性直接设置到self本身,因为当前类就是QPushButton子类
        self.setIcon(QIcon(self.set_image))
        self.setGeometry(*self.set_button_geometry)
        self.setIconSize(QSize(*self.set_button_resize))
        self.setStyleSheet("border: 0px")
        self.setVisible(self.set_button_visible)

2. 主窗口实例化按钮时传入父控件

创建ButtonClass实例的时候把当前主窗口对象self作为parent参数传入,就能把按钮绑定到主窗口内:

# 从ButtonClass类初始化播放按钮,新增parent=self参数
self.play_button = ButtonClass('Images/Play_standard.png', [165, 580, 70, 70], [70, 70], True, parent=self)

完整修改后可运行代码

from PyQt6.QtWidgets import QApplication, QPushButton, QWidget
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import *

import sys

class ButtonClass(QPushButton):
    def __init__(self, set_image, set_button_geometry, set_button_resize, set_button_visible, parent=None):
        super().__init__(parent=parent)
        self.set_image = set_image
        self.set_button_geometry = set_button_geometry
        self.set_button_resize = set_button_resize
        self.set_button_visible = set_button_visible
        self.button_attributes()

    def button_attributes(self):
        self.setIcon(QIcon(self.set_image))
        self.setGeometry(*self.set_button_geometry)
        self.setIconSize(QSize(*self.set_button_resize))
        self.setStyleSheet("border: 0px")
        self.setVisible(self.set_button_visible)


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Soular")
        self.setFixedHeight(700)
        self.setFixedWidth(400)
        self.setStyleSheet("background-color:'#323232'")
        self.move(10, 10)
        self.play_button = ButtonClass('Images/Play_standard.png', [165, 580, 70, 70], [70, 70], True, parent=self)


app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())

内容的提问来源于stack exchange,提问作者Ian Thompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:54:01