我正在尝试实现一个功能,当在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)
任何建议都将不胜感激
答案 0 :(得分:2)
在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_())
答案 1 :(得分: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: 另请注意,由于您正在检查应用程序中的每个事件,因此可能会导致性能问题。