2012-10-24 121 views
6

我在pyQT中動態地創建了​​中的按鈕(QtoolButton)。 如何獲得佈局中點擊的按鈕的名稱?PyQT按鈕被點擊的名字

我無法預先知道名稱。 是否有觸發器來完成任務?

在此先感謝。

+0

請張貼一些代碼。 – Avaris

回答

17

您可以連接到您的按鈕事件來獲取觸發事件的對象的函數調用self.sender()。從那裏您可以調用對象的objectName()方法來獲取名稱。

下面是一個簡單的例子 - 小部件有10個按鈕,單擊按鈕將更新標籤的文本以顯示按鈕名稱。

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

@加里,你的工作很棒。它解決了我的問題。謝謝 –

+0

@ Gary,但'.objectName()'返回'None'。任何想法爲什麼? –

+0

聽起來像你還沒有設置對象名稱。如果它是按鈕的文本,則可以嘗試'.text()'。 –

-1

我認爲你必須實現從QToolButton派生的iconlabel類:
這樣的:

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

我正在使用'lambda','lambda:self.doSomthing(self.buttonName)',它不工作,如何使用回調? –

+0

這可能是有用的你:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html – Al2O3

+0

@ Rubby謝謝你,鏈接的文檔。 –