mouseReleaseEvent在应用程序启动时触发,而不是在PyQt5中单击

时间:2016-11-03 00:50:00

标签: python qt pyqt pyqt5

在使用PyQt5编写的Python 3.5应用程序中,我有像这样的mouseReleaseEvents

self.scene1.mouseReleaseEvent = self.setScene("1")

当他们有要传递的变量时,它们都会在应用程序启动时触发,并且在实际点击时不会触发。

但是,如果删除变量,它们在按下时会起作用,并且在应用程序启动时不会触发:

self.scene1.mouseReleaseEvent = self.setScene

但我必须得到一个变量到这个函数

def setScene(self, scene):
    print(scene)

有关变量导致此行为的原因以及如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:1)

当您将函数绑定到事件时,可能在每个GUI中都必须使用函数名称 - 这意味着没有()和参数。

你可以有两种方法

  • "无聊":创建没有参数的函数并分配给事件

    def new_fun(self):
        self.setScene("1")
    
    self.scene1.mouseReleaseEvent = self.new_fun
    
  • "热门":使用lambda创建匿名函数

    self.scene1.mouseReleaseEvent = lambda:self.setScene("1")
    

我不知道,但mouseReleaseEvent可以使用event对象运行,该对象包含有关事件的信息,因此您必须抓住它

self.scene1.mouseReleaseEvent = lambda event:self.setScene("1")

如果您必须在lambda循环中使用for x并在x函数中使用lambda,那么您需要

for x in some_list:
   self.scene1.mouseReleaseEvent = lambda event, arg=x :self.setScene(arg)

因为lambda"lazy",并且在定义x时它不会将值从lambda复制到函数,但它从x获取值当你释放鼠标时 - 但是那个momen x的最后一个值来自some_list