我有一个 QMainWindow,其中包含一个
DrawingPointsWidget
。该小部件随机绘制红点。我通过使用 self.installEventFilter(self)
为 MouseHovering 事件安装事件过滤器并实现 eventFilter()
方法,在 QMainWindow 的状态栏中显示鼠标坐标。有用。但是我想获取这个红点小部件上的鼠标坐标,而不是 QMainWindow 上的坐标。所以我希望当鼠标位于点部件的左上角而不是 QMainWindow 的左上角时,状态栏显示 [0, 0]。我怎么做?我尝试了self.installEventFilter(points)
但什么也没发生。
您将在下面找到一段有效的代码。
似乎如果我写
points.installEventFilter(self)
,就会检测到QtCore.Event.MouseButtonPressed
事件,只有HoverMove
没有检测到。因此,在我的 HoverMove
(即 DrawingPointsWidget
)上未检测到 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)