PyQT中事件的识别源
我正在学习PyQt4,现在遇到了一个关于事件的问题。
我有一个主类,叫做MainWindow。MainWindow里面有一堆按钮,这些按钮是ButtonX类型的(它们是从QPushButton继承来的)。我想实现两个解决方案中的一个(具体哪个更简单就用哪个)。
1) 当我点击列表中的一个按钮时,我希望能运行MainWindow中的一个方法。我想在这个方法里能够知道是哪个按钮被点击了。
2) 第二个解决方案是直接运行ButtonX类中定义的方法。
我尝试过的代码是:
QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0).buttonMethod())
QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0), QtCore.SLOT("incrementValue()"))
甚至这行代码还让Python解释器挂掉了。
QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0), QtCore.SLOT("incrementValue"))
1 个回答
4
1) 在列表中点击一个按钮后,我想要运行MainWindow中的一个方法。我希望能够识别出是哪个按钮被点击了。
你可以通过 QObject.sender() 来获取事件的来源。不过,正如说明所说,通常使用 QSignalMapper 或者采用更面向对象的方式会更好。
2) 第二种解决方案是运行在ButtonX类中定义的方法。
仔细看看你在第一次连接调用的最后一个参数输入的内容:
self.getButton(0, 0).buttonMethod()
上面的代码会用参数 0, 0
来计算 getButton
,然后在这个对象上调用 buttonMethod
方法。所以,除非 buttonMethod
返回一个方法,否则你就是在把 buttonMethod
的返回值作为连接调用的最后一个参数。如果这个方法返回的是一个函数,那这样做是没问题的。
我更希望看到类似下面的代码:
self.getButton(0, 0).buttonMethod # note no parenthesis at end
看看PyQt自带的示例目录,它们会展示确切的语法,并且是很好的示例。
这里有一个小例子:
class MW(QMainWindow):
def __init__(self, *args)
QMainWindow.__init__(self, *args)
layout = QHBoxLayout(self)
self.b1 = QPushButton("Button1")
self.b2 = QPushButton("Button2")
layout.addWidget(self.b1)
layout.addWidget(self.b2)
self.connect(self.b1, SIGNAL("clicked()"), self.buttonWasPressed)
self.connect(self.b2, SIGNAL("clicked()"), self.buttonWasPressed)
def buttonWasPressed(self):
print "button %s was pressed" % self.sender()