PyQt4,如何一次性添加多个QPushButton并让它们执行槽函数

7 投票
4 回答
1942 浏览
提问于 2025-04-15 18:18

如果我想一次性添加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()),这样你就能得到发出信号的那个对象的引用。这里有关于这个方法的详细说明。

撰写回答