Как добавить свой атрибут в класс 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  # Заменяем стандартную ссылку на новый класс

Но это очень грязно. Если Вы собираетесь далее этот код куда-то распространять, то так делать не следует. Так же, если Вы сами в будущем вернётесь к этому коду, то Вы будете не рады такому "сюрпризу", оставленному самому себе.

→ Ссылка
Автор решения: S. Nick

я уже отвечал на вопрос о Встраивание пользовательских виджетов в 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

введите сюда описание изображения

→ Ссылка