2014-10-08 23 views
0

我正在做一些很酷的自定義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無法捕獲它,在上傳屏幕截圖之前我沒有意識到。抱歉。

回答

2

我認爲你需要從你的矩形的x/y分量中減去page()->mainFrame()->scrollPosition()的x/y分量。

此屬性保留框架當前滾動到的位置。

相關問題