PyQT中事件的识别源

1 投票
1 回答
4227 浏览
提问于 2025-04-15 23:13

我正在学习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()

撰写回答