如何检测pysidegui上的鼠标点击?

2024-04-24 12:14:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现这样一个特性:当鼠标单击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_())

这是我的目标

^{pr2}$

如有任何建议,将不胜感激


Tags: fromimportselfinitmaindefsysgui
2条回答

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_())

这可能会变得复杂,取决于你的需要。简而言之,解决方案是安装在应用程序上的^{}。这将侦听事件的整个应用程序。问题是“事件传播”。如果小部件不处理事件,它将被传递给父对象(依此类推)。你会多次看到这些事件。在您的例子中,例如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将显示如下内容:

^{pr2}$

因为,QLabel接收事件,并且由于它不做任何处理,它被忽略并传递给父对象(MainWindow)。它又被过滤器/监视器捕捉到了。在

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

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

相关问题 更多 >