将QPainter涂料置于QScrollArea内部的内容之上,并且已滚动到正确的位置
问题描述:
我正在做一些很酷的自定义QWebView
,基本上是在鼠标指针下的元素上画一个矩形见:将QPainter涂料置于QScrollArea内部的内容之上,并且已滚动到正确的位置
但是,如果我向下滚动,再次移动鼠标指针,它借鉴了错误的区域的矩形。在下面的截图中鼠标在包含搜索结果,矩形的顶部和QWebView
的顶部有一个很大的差距:
我没有插入此bug已被简单地计算什么考虑到水平和垂直滚动位置的矩形的位置,我做了这个错误的计算,因为如果我滚动它,矩形关于内容的位置不正确。在这两种情况下,如果发生任何滚动,我都会在错误的位置绘制矩形。
到目前为止,这是我此刻的代码:
#!/usr/bin/env python2
# coding: utf-8
# VENI, SANCTE SPIRITUS
from PySide.QtWebKit import QWebView
from PySide import QtCore, QtGui
class CustomQWebView(QWebView):
def __init__(self, *args, **kwargs):
""" Init the custom class
"""
super(CustomQWebView, self).__init__(*args, **kwargs)
self.currentframe = None
self.lastelement = None
self.lastelementboundingrect = None
self.loadFinished.connect(self.setframeafterloadfinished)
# default test pen
self.defaultpen = QtGui.QPen(QtCore.Qt.blue)
self.defaultpen.setWidth(3)
@QtCore.Slot(QtGui.QMouseEvent)
def mouseMoveEvent(self, event):
super(CustomQWebView, self).mouseMoveEvent(event)
if self.currentframe:
hittestresult = self.currentframe.hitTestContent(event.pos())
element = hittestresult.element()
if self.lastelement != element:
self.lastelement = element
self.lastelementboundingrect = hittestresult.boundingRect()
self.update()
@QtCore.Slot(QtGui.QPaintEvent)
def paintEvent(self, event):
# draw the content first
super(CustomQWebView, self).paintEvent(event)
# then the rectangle
if self.lastelementboundingrect:
painter = QtGui.QPainter(self)
painter.setPen(self.defaultpen)
# This rectangles takes into account any offset of the scroll bar
# so the rectangle can be drawn correctly
rect = QtCore.QRect()
rect.setRect(self.lastelementboundingrect.x() +
self.currentframe.scrollPosition().x(),
self.lastelementboundingrect.y() +
self.currentframe.scrollPosition().y(),
self.lastelementboundingrect.width(),
self.lastelementboundingrect.height())
# painter.drawRect(QtCore.QRectF(self.lastelementcurrectrect))
painter.fillRect(
QtCore.QRectF(rect), QtGui.QColor(255, 165, 0, 128))
def setframeafterloadfinished(self):
self.currentframe = self.page().mainFrame()
我怎样才能正确地解决了定位问题?
P.S .:是的,指针没有出现在屏幕截图中,因为scrot无法捕获它,在上传屏幕截图之前我没有意识到。抱歉。
答
我认为你需要从你的矩形的x/y分量中减去page()->mainFrame()->scrollPosition()
的x/y分量。
此属性保留框架当前滚动到的位置。