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
相关产品推荐
相关产品推荐

