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

标签 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)

关于变量为何导致此行为以及如何修复它有什么建议吗?

最佳答案

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

你可以有两种方法

  • “boring”:创建不带参数的函数并分配给事件

    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")
<小时/>

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

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

因为 lambda“惰性”,并且当您定义 lambda 时,它不会将值从 x 复制到函数中code> 但当您释放鼠标时,它会从 x 获取值 - 但此时 x 具有来自 some_list 的最后一个值。

关于python - mouseReleaseEvent 在应用程序启动时触发,而不是在 PyQt5 中单击时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40392127/

相关文章:

qt - 解决 QT 的 QString arg() 歧义

python - 在 PyQt 中设置 Windows 任务栏图标

python - 在QTableWidget中,如何确定空单元格是否可编辑?

python - 如何使用 ccxt 为 backtrader 创建 pandasData

python - 如何使用 QGraphicsScene 和 QGraphicsView 在 PyQt 中分层图像

python - 如何使用 python 和 opencv 查找图像的 pca?

python - random_state 在 train_test_split 和分类器中的作用

c++ - gSoap:如何在 Qt 中设置或更改客户端上的 cookie?

c++ - 带有数字问题的自然排序文件名 C++

python - PyQT 中显示 QDialog 后执行代码的惯用方法是什么?