Как обнаружить любой щелчок мышью на 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) 

Любой совет будет принят во внимание

Определить mousePressEvent внутри Main :

 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: Также обратите внимание, что это может вызвать проблемы с производительностью, поскольку вы проверяете каждое событие в приложении.