2012-10-24 11 views
6

Mam dynamicznie utworzone przyciski (QtoolButton) w gridLayout w pyQT. Jak mogę uzyskać nazwę przycisku klikniętego w układzie?Przycisk kliknięcia PyQT kliknięty

Nie mogę znać imienia przed ręką. Czy istnieje jakikolwiek wyzwalacz do wykonania tego zadania?

Z góry dziękuję.

+0

Proszę napisać kod. – Avaris

Odpowiedz

17

Można zadzwonić self.sender() w funkcji podłączonego do zdarzenia przycisk, aby uzyskać obiekt, który wywołał zdarzenie. Stamtąd możesz wywołać metodę obiektu objectName(), aby uzyskać nazwę.

Oto krótki przykład - widget ma 10 przycisków, a kliknięcie przycisku spowoduje aktualizację tekstu etykiety w celu wyświetlenia nazwy przycisku.

import sys 
from PyQt4.QtGui import QApplication, QWidget, QToolButton, QLabel, QVBoxLayout, QHBoxLayout 

class Widget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 

     self.button_layout = QHBoxLayout() 
     self.widget_layout = QVBoxLayout() 

     for button_number in xrange(1, 11): 
      button = QToolButton() 
      button.setText(str(button_number)) 
      button.setObjectName('Button%d' % button_number) 
      button.released.connect(self.button_released) 
      self.button_layout.addWidget(button) 

     self.status_label = QLabel('No button clicked') 

     self.widget_layout.addItem(self.button_layout) 
     self.widget_layout.addWidget(self.status_label) 
     self.setLayout(self.widget_layout) 

    def button_released(self): 
     sending_button = self.sender() 
     self.status_label.setText('%s Clicked!' % str(sending_button.objectName())) 




if __name__ == '__main__': 
    app = QApplication(sys.argv) 

    widget = Widget() 
    widget.show() 

    sys.exit(app.exec_()) 
+0

@ Gary, wszystko działało świetnie. To rozwiązało mój problem. Dzięki –

+0

@ Gary, ale '.objectName()' zwraca 'Brak'. Każdy pomysł, dlaczego? –

+0

Wygląda na to, że nie ustawiłeś nazwy obiektu. Jeśli jest to tekst przycisku, zamiast tego należy użyć '.text()'. –

-1

Chyba trzeba zaimplementować klasę iconlabel pochodzący z QToolButton:
tak:

class IconLabel : public QToolButton 
{ 
    Q_OBJECT 
public: 
    explicit IconLabel(QWidget *parent = 0); 
    bool event (QEvent* e); 
    QString name; 
signals: 
    void clicked_signal(QString); 

}; 



bool IconLabel::event (QEvent* e) { 
    if (e->type() == QEvent::Paint) { 
     return QToolButton::event(e); 


    } 
    if(e->type() == QEvent::MouseButtonPress) 
    { 

     emit clicked_signal(name); 
     return true; 
    } 

    return true; 
} 



connect(iconlabel, SIGNAL(clicked_signal(QString)), this, SLOT(getClickedButtonName(QString))); 
+0

Używam 'lambda' jak,' lambda: self.doSomthing (self.buttonName) ', nie działa, jak korzystać z oddzwaniania ?? –

+0

Może to być przydatne dla Ciebie: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html – Al2O3

+0

@ Rubby Dzięki, dla d łącza doktora. –