繁体   English   中英

如何检测任何鼠标点击PySide Gui?

[英]How to detect any mouse click on PySide Gui?

我正在尝试实现一个功能,当在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)

任何意见,将不胜感激

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

根据您的需要,这可能会变得复杂。 简而言之,解决方案是在应用程序上安装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: 另请注意,由于您正在检查应用程序中的每个事件,因此可能会导致性能问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM