将QPainter涂料置于QScrollArea内部的内容之上,并且已滚动到正确的位置

问题描述:

我正在做一些很酷的自定义QWebView,基本上是在鼠标指针下的元素上画一个矩形见:将QPainter涂料置于QScrollArea内部的内容之上,并且已滚动到正确的位置

cool stuff

但是,如果我向下滚动,再次移动鼠标指针,它借鉴了错误的区域的矩形。在下面的截图中鼠标在包含搜索结果,矩形的顶部和QWebView的顶部有一个很大的差距:

the big gap

我没有插入此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分量。

此属性保留框架当前滚动到的位置。