【问题标题】:How to detect any mouse click on PySide Gui?如何检测 PySide Gui 上的任何鼠标点击?
【发布时间】:2023-03-12 20:13:01
【问题描述】:

我正在尝试实现一个功能,当鼠标在 gui 上单击时,会触发一个功能

以下是我的鼠标点击检测,当我点击 gui 的任何部分时它不起作用

from PySide.QtCore import *
from PySide.QtGui import *

import sys


class Main(QWidget):


    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        layout  = QHBoxLayout(self)
        layout.addWidget(QLabel("this is the main frame"))
        layout.gui_clicked.connect(self.anotherSlot)

    def anotherSlot(self, passed):
        print passed
        print "now I'm in Main.anotherSlot"


class MyLayout(QHBoxLayout):
    gui_clicked = Signal(str)

    def __init__(self, parent=None):
        super(MyLayout, self).__init__(parent)

    def mousePressEvent(self, event):
        print "Mouse Clicked"
        self.gui_clicked.emit("emit the signal")



a = QApplication([])
m = Main()
m.show()
sys.exit(a.exec_())

这是我的目标

Mouseclick.gui_clicked.connect(do_something)

任何建议将不胜感激

【问题讨论】:

  • 欢迎来到 Stack Overflow!您可以做一些事情来帮助顺利获得答案。尝试包含尽可能多的相关信息。简单地说“它不起作用”不会让你走得太远。包括任何错误消息,或你得到的调试输出(后者是你在这里肯定想要的)。确保只包含 最少 数量的代码,看起来你在这里做得很好,做得很好!进行一些调试并在此处发布输出,您将走上正确的轨道
  • 感谢您的建议,所以到目前为止我还没有遇到任何错误,gui窗口确实弹出了我输入的标签,主要问题是我点击时鼠标点击没有注册gui,除了阅读我正在做的 Qt 事件的文档之外,我不确定如何调试它。

标签: python qt user-interface pyqt pyside


【解决方案1】:

Main 内定义mousePressEvent

from PySide.QtCore import *
from PySide.QtGui import *

import sys


class Main(QWidget):


    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        layout  = QHBoxLayout(self)
        layout.addWidget(QLabel("this is the main frame"))

    def mousePressEvent(self, QMouseEvent):
        #print mouse position
        print QMouseEvent.pos()


a = QApplication([])
m = Main()
m.show()
sys.exit(a.exec_())

【讨论】:

  • 谢谢,它起作用了,但我真的看不出有什么区别,我可以不将 QMouseEvent 传递给我扩展的另一个类吗?
  • @Kevin Accordind srinikom.github.io/pyside-docs/PySide/QtGui/QMouseEvent.html 文档:The PySide.QtGui.QMouseEvent class contains parameters that describe a mouse event. Mouse events occur when a mouse button is pressed or released inside a widget, or when the mouse cursor is moved。因此,您可以在继承自QWidget 的任何类中使用 QMouseEvent。 QHBoxLayoutsrinikom.github.io/pyside-docs/PySide/QtGui/…没有mousePressEvent功能。
  • @NorthCat,这个答案并不完全正确。如果Main 内有任何小部件可以处理mousePressEvent(比如QPushButton),那么Main 将不会收到该事件。
  • @Avaris 感谢您的澄清
【解决方案2】:

这可能会根据您的需要变得复杂。简而言之,解决方案是在应用程序上安装eventFilter。这将监听整个应用程序的事件。问题是“事件传播”。如果小部件不处理事件,它将被传递给父级(依此类推)。您会多次看到这些事件。在您的情况下,例如 QLabel 不会对鼠标按下事件执行任何操作,因此父级(您的主窗口)会得到它。

如果您实际上过滤了事件(即您不希望原始小部件响应事件),您将不会遇到这个问题。但是,我怀疑这是你的意图。

仅用于监控的简单示例:

import sys
from PySide import QtGui, QtCore

class MouseDetector(QtCore.QObject):
    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            print 'mouse pressed', obj
        return super(MouseDetector, self).eventFilter(obj, event)

class MainWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        layout = QtGui.QHBoxLayout()
        layout.addWidget(QtGui.QLabel('this is a label'))
        layout.addWidget(QtGui.QPushButton('Button'))

        self.setLayout(layout)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    mouseFilter = MouseDetector()
    app.installEventFilter(mouseFilter)

    main = MainWindow()
    main.show()

    sys.exit(app.exec_())

你可以看到,点击QLabel会得到类似的东西:

mouse pressed <PySide.QtGui.QLabel object at 0x02B92490>
mouse pressed <__main__.MainWindow object at 0x02B92440>

因为,QLabel 接收到该事件,并且由于它没有对它做任何事情,所以它被忽略并传递给父级 (MainWindow)。它再次被过滤器/监视器捕获。

单击QPushButton 没有任何问题,因为它使用该事件并且不会传递给父级。

PS: 另外请注意,这可能会导致性能问题,因为您正在检查应用程序中的每个事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2011-11-21
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多