PyQt4,如何一次性添加多个QPushButton并让它们执行槽函数
如果我想一次性添加10个QPushButton按钮:
NumCount=20
for i in range(NumCount):
btn=QPushButton("%s %s" %("Button" i+1),self)
btn.clicked.connect(self.btnclick)
def btnclick(self):
# here is my question
# how to define which button clicked?
# how to print btn.text?
就像在def(btnclick)中提到的那样。
4 个回答
1
正如gruszcsy所说,QObject里有一个叫做self.sender()的方法,可以用来获取发送信号的对象的信息。
还有一个叫做QSignalMapper的类,它可以把多个信号发送者映射到一个槽(处理函数)上。这对于处理多个信号对应一个槽的基本情况非常有帮助。
Chris B提到的定义一个新的槽,并把发送者作为参数传递的建议稍微复杂一些,但在程序结构和类之间的分离上更清晰。我通常在目标槽在另一个对象时使用这种方法。而在一个类的私有槽内部进行映射时,使用sender()既简洁又合适,我觉得这样很好。
2
我会创建一个新的类,继承自 QPushButton
,然后定义我自己的发送者和槽函数。虽然 QObject.sender()
方法看起来很吸引人,但我对它有点不放心。
class MyPushButton(QPushButton):
def __init__(self, text = '', parent = None):
QPushButton.__init__(self, text, parent)
self.clicked.connect(self._handle_click)
my_click = QtCore.pyqtSignal(QObject)
def _handle_click(self):
my_click.emit(self)
def btnclick(btn):
print 'Handle button %s' % btn
for i in xrange(20):
btn = MyPushButton('%s %s' % ('Button', i + 1), self)
btn.my_click.connect(btnclick)
一种更符合 Python 风格的方法是直接在类里面定义行为,像这样:
class MyPushButton(QPushButton):
def __init__(self, button_number, parent = None):
QPushButton.__init__(self, '%s %s' % ('Button', button_number), parent)
self.button_number = button_number
self.clicked.connect(self._handle_click)
def _handle_click(self):
print 'Handle button %s' % self
for i in xrange(20):
btn = MyPushButton(i + 1, self)
3
当你在一个槽函数里时,可以使用 sender() 方法(也就是调用 self.sender()),这样你就能得到发出信号的那个对象的引用。这里有关于这个方法的详细说明。