【发布时间】:2012-10-14 14:05:39
【问题描述】:
我在 pyQT 中的gridLayout 中动态创建了按钮(QtoolButton)。
如何获取布局中点击的按钮名称?
我不能事先知道这个名字。 有什么触发器可以完成任务吗?
提前致谢。
【问题讨论】:
我在 pyQT 中的gridLayout 中动态创建了按钮(QtoolButton)。
如何获取布局中点击的按钮名称?
我不能事先知道这个名字。 有什么触发器可以完成任务吗?
提前致谢。
【问题讨论】:
您可以在连接到您的按钮事件的函数中调用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_())
【讨论】:
.objectName() 正在返回None。知道为什么吗?
.text()。
QAction所附的QToolButton?
.defaultAction()?它至少返回一个QAction。 riverbankcomputing.co.uk/static/Docs/PyQt4/html/…
QAction(QWidgetItem) 获取QToolButton(QWidget) 使用.getParent() 方法QWidgetItem
我认为您必须实现从 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,如lambda: self.doSomthing(self.buttonName),它不起作用,如何使用回调??