Как добавить свой атрибут в класс QPushButton
У меня в форме (convtest) созданной в qt designer 400 кнопок , я хочу к каждой кнопке добавить атрибут pos_value , но перспектива писать 400 строк что бы каждой кнопке добавить этот атрибут , не из приятных . Я понимаю что нужно как то подлезть в конструктор класса QPushButton и там прописать этот атрибут , что бы при создании обьекта QPushButton сразу был этот атрибут . Надеюсь я понятно изъяснился . Простите мой уровень знаний python и oop достаточно слабый . Надеюсь получить пример в виде кода . Конкретно мне надо что бы при создании экземпляра сразу появлялся данный атрибут у кнопки .
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget
from PyQt5.QtCore import Qt, QPoint
from convtest import Ui_MainWindow
# Главное окно
class MyWin(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.pos_value = [0, 0, 0, 0] # Атрибут кнопки
self.ui.pushButton1.pos_value = [0, 0, 0, 0] # Атрибут кнопки
Ответы (2 шт):
for i in range(400):
getattr(self.ui, f"pushButton{i}").pos_value = [0, 0, 0, 0]
Но вообще, всем Вашим 400 кнопкам следовало бы быть в одном списке, потому что это костыли.
Если необходимо, чтобы этот атрибут был у каждой кнопки, то можно сделать вот так (всё это проделать перед созданием формы):
class MyButton(QPushButton): # Объявляем новый класс
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # Вызываем конструктор родителя
self.pos_value = [0, 0, 0, 0] # Добавляем атрибут
QPushButton = MyButton # Заменяем стандартную ссылку на новый класс
Но это очень грязно. Если Вы собираетесь далее этот код куда-то распространять, то так делать не следует. Так же, если Вы сами в будущем вернётесь к этому коду, то Вы будете не рады такому "сюрпризу", оставленному самому себе.
я уже отвечал на вопрос о Встраивание пользовательских виджетов в Qt Designer
Как загрузить график на форму в PyQT?
...
Добавьте кнопку.
Щелкните правой кнопкой мыши виджет и выберите Promote to...
в контекстном меню виджета.
Продвижение QPushButton указывает на то, что его следует заменить указанным подклассом,
в нашем случае - графическим виджетом MyPushButton.
header file - это имя модуля Python, используемого для импорта класса,
а именно my_push_button. (my_push_button.py)
my_pb.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>392</width>
<height>286</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="MyPushButton" name="pushButton">
<property name="text">
<string>1</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="MyPushButton" name="pushButton_2">
<property name="text">
<string>2</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="MyPushButton" name="pushButton_3">
<property name="text">
<string>3</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="MyPushButton" name="pushButton_4">
<property name="text">
<string>4</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="MyPushButton" name="pushButton_5">
<property name="text">
<string>5</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="MyPushButton" name="pushButton_6">
<property name="text">
<string>6</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="MyPushButton" name="pushButton_7">
<property name="text">
<string>7</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="MyPushButton" name="pushButton_8">
<property name="text">
<string>8</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="MyPushButton" name="pushButton_9">
<property name="text">
<string>9</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>392</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>MyPushButton</class>
<extends>QPushButton</extends>
<header>my_push_button</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
Выполните
pyuic5 my_pb.ui -o my_pb.py -x
Создайте
my_push_button.py
from PyQt5 import QtWidgets
class MyPushButton(QtWidgets.QPushButton):
def __init__(self, parent=None):
super(MyPushButton, self).__init__(parent)
self.pos_value = [0, 0, 0, 0] # Атрибут кнопки
self.clicked.connect(lambda: print(self.text(), self.pos_value))
Запустите
python my_pb.py


