使用 PyQt4 在 QWidget 上使用 eventFilter
eventFilter on a QWidget with PyQt4
我有一个包含 DrawingPointsWidget
的 QMainWindow。这个小部件随机绘制红点。我通过使用 self.installEventFilter(self)
为 MouseHovering 事件安装事件过滤器并实现 eventFilter()
方法,在 QMainWindow 的状态栏中显示鼠标坐标。有用。但是我想在这个红点小部件上获取鼠标坐标,而不是在 QMainWindow 上。因此,当鼠标位于点小部件的左上角而不是 QMainWindow 时,我希望状态栏显示 [0, 0]。我怎么做?我尝试了 self.installEventFilter(points)
但没有任何反应。
您将在下面找到一段有效的代码。
编辑 1
好像我写points.installEventFilter(self)
,QtCore.Event.MouseButtonPressed
事件被检测到,只有HoverMove
没有。所以在我的 DrawingPointsWidget
上没有检测到 HoverMove
事件,这是一个 QWidget
。
令人惊讶的是,HoverMove
事件是在 QPushButton
上检测到的,QAbstractButton
也是 QWidget
!我需要写 button.installEventFilter(self)
import sys
import random
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *
class MainWindow(QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.__setUI()
def __setUI(self, appTitle="[default title]"):
self.statusBar()
mainWidget = QWidget()
vbox = QVBoxLayout()
button = QPushButton("Hello")
vbox.addWidget( button )
points = DrawingPointsWidget()
vbox.addWidget(points)
mainWidget.setLayout(vbox)
self.setCentralWidget(mainWidget)
self.installEventFilter(self)
def eventFilter(self, object, event):
if event.type() == QtCore.QEvent.HoverMove:
mousePosition = event.pos()
cursor = QtGui.QCursor()
self.statusBar().showMessage(
"Mouse: [" + mousePosition.x().__str__() + ", " + mousePosition.y().__str__() + "]"
+ "\tCursor: [" + cursor.pos().x().__str__() + ", " + cursor.pos().y().__str__() + "]"
)
return True
elif event.type() == QtCore.QEvent.MouseButtonPress:
print "Mouse pressed"
return True
return False
class DrawingPointsWidget(QWidget):
""
def __init__(self):
super(QWidget, self).__init__()
self.__setUI()
def __setUI(self):
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('Points')
self.show()
def paintEvent(self, e):
"Re-implemented method"
qp = QtGui.QPainter()
qp.begin(self)
self.drawPoints(qp)
qp.end()
def drawPoints(self, qp):
qp.setPen(QtCore.Qt.red)
"Need to get the size in case the window is resized -> generates a new paint event"
size = self.size()
for i in range(1000):
x = random.randint(1, size.width()-1 )
y = random.randint(1, size.height()-1 )
qp.drawPoint(x, y)
def main():
app = QApplication(sys.argv)
#window = WidgetsWindow2()
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
首先,需要设置事件过滤器您要观看的对象:
points.installEventFilter(self)
其次,您需要监听的事件是MouseMove
而不是HoverMove
:
if event.type() == QtCore.QEvent.MouseMove:
最后,您需要在目标小部件上启用鼠标跟踪:
class DrawingPointsWidget(QWidget):
def __init__(self):
super(QWidget, self).__init__()
self.setMouseTracking(True)
我有一个包含 DrawingPointsWidget
的 QMainWindow。这个小部件随机绘制红点。我通过使用 self.installEventFilter(self)
为 MouseHovering 事件安装事件过滤器并实现 eventFilter()
方法,在 QMainWindow 的状态栏中显示鼠标坐标。有用。但是我想在这个红点小部件上获取鼠标坐标,而不是在 QMainWindow 上。因此,当鼠标位于点小部件的左上角而不是 QMainWindow 时,我希望状态栏显示 [0, 0]。我怎么做?我尝试了 self.installEventFilter(points)
但没有任何反应。
您将在下面找到一段有效的代码。
编辑 1
好像我写points.installEventFilter(self)
,QtCore.Event.MouseButtonPressed
事件被检测到,只有HoverMove
没有。所以在我的 DrawingPointsWidget
上没有检测到 HoverMove
事件,这是一个 QWidget
。
令人惊讶的是,HoverMove
事件是在 QPushButton
上检测到的,QAbstractButton
也是 QWidget
!我需要写 button.installEventFilter(self)
import sys
import random
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import *
class MainWindow(QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.__setUI()
def __setUI(self, appTitle="[default title]"):
self.statusBar()
mainWidget = QWidget()
vbox = QVBoxLayout()
button = QPushButton("Hello")
vbox.addWidget( button )
points = DrawingPointsWidget()
vbox.addWidget(points)
mainWidget.setLayout(vbox)
self.setCentralWidget(mainWidget)
self.installEventFilter(self)
def eventFilter(self, object, event):
if event.type() == QtCore.QEvent.HoverMove:
mousePosition = event.pos()
cursor = QtGui.QCursor()
self.statusBar().showMessage(
"Mouse: [" + mousePosition.x().__str__() + ", " + mousePosition.y().__str__() + "]"
+ "\tCursor: [" + cursor.pos().x().__str__() + ", " + cursor.pos().y().__str__() + "]"
)
return True
elif event.type() == QtCore.QEvent.MouseButtonPress:
print "Mouse pressed"
return True
return False
class DrawingPointsWidget(QWidget):
""
def __init__(self):
super(QWidget, self).__init__()
self.__setUI()
def __setUI(self):
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('Points')
self.show()
def paintEvent(self, e):
"Re-implemented method"
qp = QtGui.QPainter()
qp.begin(self)
self.drawPoints(qp)
qp.end()
def drawPoints(self, qp):
qp.setPen(QtCore.Qt.red)
"Need to get the size in case the window is resized -> generates a new paint event"
size = self.size()
for i in range(1000):
x = random.randint(1, size.width()-1 )
y = random.randint(1, size.height()-1 )
qp.drawPoint(x, y)
def main():
app = QApplication(sys.argv)
#window = WidgetsWindow2()
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
首先,需要设置事件过滤器您要观看的对象:
points.installEventFilter(self)
其次,您需要监听的事件是MouseMove
而不是HoverMove
:
if event.type() == QtCore.QEvent.MouseMove:
最后,您需要在目标小部件上启用鼠标跟踪:
class DrawingPointsWidget(QWidget):
def __init__(self):
super(QWidget, self).__init__()
self.setMouseTracking(True)