【问题标题】:Trigger a function on clicking QFrame点击 QFrame 触发函数
【发布时间】:2021-10-19 14:29:15
【问题描述】:

我正在使用具有QFrames 的 PyQt5 进行项目。我正在使用鼠标按下事件来触发点击框的功能,如下所示:

frame.mousePressEvent = lambda x: print_name(x, name)

上面一行不是在开始时执行,它是在用户在 UI 中完成一些工作后执行的。

我得到了我想要的行为,但问题是:

如果用户在执行上述代码行之后单击框架,则可以正常工作,但是如果用户在执行上述代码行之前单击框架,然后再次单击框架(在执行代码之后) ,我没有得到相同的行为。基本上什么都没有发生。

我想知道问题出在哪里以及如何解决?

【问题讨论】:

    标签: python pyqt5 qframe


    【解决方案1】:

    这个问题是因为 PyQt5 缓存了方法,所以如果方法被分配了,那么它就不能被改变。除了遵循将方法分配给 mousePressEvent 的不良做法之外,还有其他更好的选择,例如:

    1. 实现继承

      class Frame(QFrame):
          def mousePressEvent(self, event):
              super().mousePressEvent(event)
              print(event)
      
    2. 使用事件过滤器

      class MouseObserver(QObject):
          def __init__(self, widget):
              super().__init__(widget)
              self._widget = widget
              self.widget.installEventFilter(self)
      
          @property
          def widget(self):
              return self._widget
      
          def eventFilter(self, obj, event):
              if obj is self.widget and event.type() == QEvent.MouseButtonPress:
                  print(event)
              return super().eventFilter(obj, event)
      

      然后

      observer = MouseObserver(frame)
      

    第二个似乎最适合您的情况。

    【讨论】:

    • 你能解释一下第二次实施中发生了什么吗?理论上是一步一步来的
    • @Charlie 你不明白什么?通常,我希望 OP 进行一些研究,而不仅仅是等待一步一步的教程,这不是我的风格。
    • 抱歉之前的评论。我不会重复它。我做了研究并更好地理解了实施。我之前使用过第一个实现,它似乎让每一帧都可以点击,这是我不想要的。我的疑问是第二个解决方案与第一个解决方案有何不同。我想在第二个中,当我们将帧作为输入传递时,只有该帧是可点击的。我之前对 pyqt 中的事件概念并不熟悉,所以我有疑问。对不起。
    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多