Ловить сигнал, когда QWebView прокручивается до конца - PullRequest
0 голосов
/ 28 ноября 2011

Когда пользователь прокручивает свою мышь в виджете QWebView, могу ли я узнать, попал ли он в начало / конец веб-содержимого?

Я могу поместить QWebView :: wheelEvent () внутри, но какМогу ли я узнать о позициях прокрутки?

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Вы можете проверить scrollPosition основного блока страницы:

QPoint currentPosition = webView->page()->mainFrame()->scrollPosition();

if (currentPosition.y() == webView->page()->mainFrame()->scrollBarMinimum(Qt::Vertical))
   qDebug() << "Head of contents";
if (currentPosition.y() == webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical))
   qDebug() << "End of contents";
0 голосов
/ 22 апреля 2014

Я нашел этот вопрос при поиске фактического сигнала , когда позиция прокрутки была изменена.

Существует сигнал 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)
...