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)
我想我有点累了,可能错过了明显的东西,所以请放轻松 ;)
我正在尝试解决问题,我的自定义 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)