Poddałbym się podklasie QPushButton
i zdefiniowałam własnego nadawcę i gniazdo. Metoda QObject.sender()
jest kusząca, ale daje mi hebebie-jeebies.
class MyPushButton(QPushButton):
def __init__(self, text = '', parent = None):
QPushButton.__init__(self, text, parent)
self.clicked.connect(self._handle_click)
my_click = QtCore.pyqtSignal(QObject)
def _handle_click(self):
my_click.emit(self)
def btnclick(btn):
print 'Handle button %s' % btn
for i in xrange(20):
btn = MyPushButton('%s %s' % ('Button', i + 1), self)
btn.my_click.connect(btnclick)
Nieco bardziej pythonowy sposób w ten sposób mógł zdefiniować zachowanie w klasie, tak jak poniżej:
class MyPushButton(QPushButton):
def __init__(self, button_number, parent = None):
QPushButton.__init__(self, '%s %s' % ('Button', button_number), parent)
self.button_number = button_number
self.clicked.connect(self._handle_click)
def _handle_click(self):
print 'Handle button %s' % self
for i in xrange(20):
btn = MyPushButton(i + 1, self)
Poważnie, nie ma nic złego z nadawcą(). Użyłem go całkiem sporo i działa dobrze. Należy jednak zachować ostrożność. Zwykle używam twojej metody podczas sygnalizowania zewnętrznie (tj. Do innych obiektów), ale nadawcy() podczas trasowania sygnałów wewnątrz klasy. – Macke
Nie może być nic złego w .sender(), ale jak mówi dokumentacja, to "narusza obiektową zasadę modułowości". Co prawda nie byłaby to śmierć nikogo. Mogę być kuszony, by użyć go jako "szybkiej i brudnej" poprawki. Ale Python sprawia, że tak łatwo zrobić to lepiej i czystsze, prawdopodobnie lepiej jest zrobić to dobrze, na dłuższą metę. –
+1 Subklasowanie jest złe, zasady funkcji zewnętrznych rządzą :)) – mlvljr