如果我想一次添加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)中所述。
答案 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_()
请享受:)