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