PyQT 对象无意中出现在单独的 window 中

PyQT object unintentionally appearing in separate window

我想我有点累了,可能错过了明显的东西,所以请放轻松 ;)

我正在尝试解决问题,我的自定义 QPushButton class 对象显示在单独的 window 中(参见附图)。如果我通过函数而不是 class 实现按钮,那么它会出现在主 window 中。但是,由于应用程序有多个按钮(我删除了按钮以简化代码并帮助故障排除),为了尽量减少代码的重复,我想实现一个可重用的 class.

很明显,代码运行正常:显示了按钮。我的问题是,我如何 link 我的 ButtonClass 对象到我的 Window 对象?

这是我的代码:

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):
        super().__init__()

        # Instance variables assigned with arguments
        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

        # Initialise instance of QPushButton
        self.button = QPushButton()

        # Declare variable, inherit QPushButton->QAbstractButton->QWidget functions
        self.button_attributes()

    def button_attributes(self):
        

        # Assign icon to QPushButton object and insert custom image
        self.button.setIcon(QIcon(self.set_image))

        # Specify button geometry
        self.button.setGeometry(self.set_button_geometry[0],
                                self.set_button_geometry[1],
                                self.set_button_geometry[2],
                                self.set_button_geometry[3])

        # Specify Icon size
        self.button.setIconSize(QSize(self.set_button_resize[0],
                                      self.set_button_resize[1]))

        # Stylesheet attributes
        self.button.setStyleSheet("border: 0px")

        # Set button visibility
        self.button.setVisible(self.set_button_visible)


class Window(QWidget):
    def __init__(self):
        super().__init__()
        # Define window title
        self.setWindowTitle("Soular")

        # Define window height
        self.setFixedHeight(700)

        # Define window width
        self.setFixedWidth(400)

        # window stylesheet defines window background colour
        self.setStyleSheet("background-color:'#323232'")
        self.move(10, 10)

        # initialises play_button from class 'Button_class'
        self.play_button = ButtonClass('Images/Play_standard.png', [165, 580, 70, 70], [70, 70], True)


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

这就是输出:

Output two PyQT windows

您缺少告诉 QPushButton 它应该属于哪个 window 的部分。参见示例 this question,其中 QPushButton 接收 QWidget 作为参数。在您的情况下,您可以通过将对 Window 的引用(我将在此处调用参数 parent)传递给 ButtonClass 它位于 Window 内=19=]-方法并将parent传递给QPushButton.__init__-方法,像这样:

def __init__(self, parent, set_image, set_button_geometry, set_button_resize, set_button_visible):
        super().__init__(parent)

并通过引用 Window 调用 ButtonClass,如下所示:

self.play_button = ButtonClass(self, 'Images/Play_standard.png', [165, 580, 70, 70], [70, 70], True)