Я нашел этот вопрос при поиске фактического сигнала , когда позиция прокрутки была изменена.
Существует сигнал QWebPage::scrollRequested
, который можно использовать. Документация гласит: Этот сигнал испускается всякий раз, когда необходимо прокрутить содержимое, заданное rectToScroll, на dx и dy вниз , а представление не было установлено. , однако последняя часть неправильно, сигнал фактически всегда излучается.
Я внес исправление для этого в Qt, так что это, вероятно, будет исправлено, как только будут обновлены документы.
(оригинальный пост следующий)
QWebView не предоставляет этого, поскольку WebKit управляет областью прокрутки.
В итоге я расширил paintEvent
, чтобы проверить там положение прокрутки и издать сигнал, когда он изменился.
PyQt-код, который испускает сигнал scroll_pos_changed
с процентом:
class WebView(QWebView):
scroll_pos_changed = pyqtSignal(int, int)
def __init__(self, parent=None):
super().__init__(parent)
self._scroll_pos = (-1, -1)
def paintEvent(self, e):
"""Extend paintEvent to emit a signal if the scroll position changed.
This is a bit of a hack: We listen to repaint requests here, in the
hope a repaint will always be requested when scrolling, and if the
scroll position actually changed, we emit a signal..
"""
frame = self.page_.mainFrame()
new_pos = (frame.scrollBarValue(Qt.Horizontal),
frame.scrollBarValue(Qt.Vertical))
if self._scroll_pos != new_pos:
self._scroll_pos = new_pos
m = (frame.scrollBarMaximum(Qt.Horizontal),
frame.scrollBarMaximum(Qt.Vertical))
perc = (round(100 * new_pos[0] / m[0]) if m[0] != 0 else 0,
round(100 * new_pos[1] / m[1]) if m[1] != 0 else 0)
self.scroll_pos_changed.emit(*perc)
# Let superclass handle the event
return super().paintEvent(e)