2012-10-24 34 views
6

Tôi có các nút được tạo động (QtoolButton) trong gridLayout trong pyQT. Tôi làm cách nào để có được tên của nút được nhấp trong bố cục?Nút PyQT được nhấp vào tên

Tôi không thể biết tên trước khi tay. Có bất kỳ trình kích hoạt nào để thực hiện nhiệm vụ không?

Xin cảm ơn trước.

+0

Vui lòng đăng một số mã. – Avaris

Trả lời

17

Bạn có thể gọi self.sender() trong một chức năng kết nối với sự kiện nút bấm của bạn để có được những đối tượng đó gây ra sự kiện này. Từ đó bạn có thể gọi phương thức objectName() của đối tượng để lấy tên.

Dưới đây là ví dụ nhanh - tiện ích có 10 nút và nhấp vào nút sẽ cập nhật văn bản của nhãn để hiển thị tên nút.

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, ya nó hoạt động rất tốt. Nó giải quyết được vấn đề của tôi. Cảm ơn –

+0

@ Gary, nhưng '.objectName()' đang trả về 'Không có'. Bất kỳ ý tưởng tại sao? –

+0

Có vẻ như bạn chưa đặt tên đối tượng. Nếu đó là văn bản của nút bạn muốn thử '.text()' thay thế. –

-1

Tôi nghĩ rằng bạn phải thực hiện lớp iconlabel của bạn bắt nguồn từ QToolButton:
Giống như này:

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

Tôi đang sử dụng 'lambda' như,' lambda: self.doSomthing (self.buttonName) ', nó không hoạt động, cách sử dụng gọi lại ?? –

+0

Có thể điều này hữu ích cho bạn: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html – Al2O3

+0

@ Rubby Cảm ơn bạn đã liên kết với doc. –

Các vấn đề liên quan