PyQt4,如何一次添加一批小部件(QPushButton)并让它们在SLOT上执行

时间:2010-01-21 09:18:37

标签: python pyqt signals sender

如果我想一次添加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 个答案:

答案 0 :(得分:3)

当您在插槽中时,可以使用sender()方法(只需调用self.sender()),您将收到对象的引用,从该对象发出信号。 Here是关于它的文档。

答案 1 :(得分: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)

稍微多一些Pythonic的方法可以定义类中的行为,如下所示:

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)

答案 2 :(得分:1)

正如gruszcsy所说,有自我。sender()(在QObject中)来获取确切的信息。

还有QSignalMapper类提供从几个信号发送器到一个插槽的更高级别映射。它有助于实现多对一信号/插槽映射的基本情况。

Chris B关于定义一个将发送者作为参数传输的新插槽的建议有点复杂,但在程序结构和类之间的分离方面更为清晰。当目标槽位于另一个对象中时,我倾向于使用该方法。对于在类的私有槽内进行映射,sender()既干净又合适,IMO。

答案 3 :(得分:0)

这是一个小应用程序,展示了一种可能的解决方案:

from PyQt4.QtGui import QPushButton, QWidget
from PyQt4.QtGui import QVBoxLayout, QApplication

def smart_connect(btn, btn_click_slot):
    proxy_slot = lambda checked: btn_click_slot(btn)
    btn.clicked.connect(proxy_slot)

class MyWidget(QWidget):
    btn_count = 4
    def __init__(self):
        super(MyWidget, self).__init__()
        lt = QVBoxLayout(self)
        for i in range(self.btn_count):
            btn = QPushButton("Button %s"%(i+1))
            smart_connect(btn, self.btn_click)
            lt.addWidget(btn)
    def btn_click(self, btn):
        print "Button '%s' was clicked."%btn.text()

app = QApplication([])
wgt = MyWidget()
wgt.show()
app.exec_()

请享受:)