7

如果我想一次添加 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?

如定义(btnclick)中所述。

4

4 回答 4

3

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

于 2010-01-27T11:57:35.630 回答
2

我会继承QPushButton并定义我自己的发送者和插槽。这个QObject.sender()方法很诱人,但它给了我heebie-jeebies。

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)
于 2010-02-18T21:14:03.897 回答
1

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

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

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

于 2010-02-18T21:26:15.593 回答
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_()

请享受 :)

于 2010-02-19T17:58:43.260 回答