19

pyQT でボタン(QtoolButton)を動的に作成しました。gridLayoutレイアウトでクリックされたボタンの名前を取得するにはどうすればよいですか?

事前に名前を知ることはできません。タスクを達成するためのトリガーはありますか?

前もって感謝します。

4

2 に答える 2

37

ボタン イベントに接続された関数を呼び出し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_())
于 2012-10-25T09:26:29.217 に答える
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)));
于 2012-10-24T16:04:31.163 に答える