PyQT按钮点击名称

20

我在pyQT的gridLayout中动态创建了按钮(QtoolButton),如何获取布局中点击的按钮的名称?

我事先无法知道该按钮的名称。是否有任何触发器可以完成此任务?

提前感谢。

2个回答

43

你可以在与按钮事件连接的函数中调用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_())

3
@ Gary,但.objectName()返回None。有任何想法原因吗? - Program Questions
@ Gary,是的,我已经得到了按钮文本。如何查找附加在哪个 QToolButton 上的 QAction - Program Questions
只需补充一点,要从 QAction(QWidgetItem) 获取 QToolButton(QWidget),请使用 QWidgetItem.getParent() 方法。 - Program Questions
对于那些收到“unknown method sender()”错误的人,你拥有一个独特的对象层次结构,并且你想要遍历你的层次结构以获取父部件/窗口。 - Jonathan
使用widget_layout.addItem而不是addLayout有特定的原因吗? - mins
显示剩余2条评论

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)));

我正在使用类似于 lambda: self.doSomthing(self.buttonName)lambda,但它不起作用,如何使用回调函数? - Program Questions
希望这对您有用:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html - Al2O3
@Rubby,谢谢你提供文档的链接。 - Program Questions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接