0

当用户在 QWebView 小部件中用鼠标滚动时,我可以知道他是否到达网页内容的开头/结尾?

我可以在里面放置一个 QWebView::wheelEvent() ,但是我怎么知道滚动位置?

谢谢 !

4

2 回答 2

1

您可以检查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";
于 2011-11-28T08:49:26.990 回答
0

当滚动位置发生变化时,我在搜索实际信号时发现了这个问题。

QWebPage::scrollRequested可以使用的信号。文档说只要 rectToScroll 给出的内容需要向下滚动 dx 和 dy并且没有设置视图,就会发出这个信号。,但是最后一部分是错误的,实际上总是发出信号。

我为此向 Qt提供了一个修复程序,因此一旦更新文档,这可能会得到纠正。


(原帖如下)

QWebView 不提供此功能,因为 WebKit 管理滚动区域。

我最终扩展paintEvent以检查那里的滚动位置,并在它发生变化时发出信号。

发出scroll_pos_changed百分比信号的 PyQt 代码:

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)
于 2014-04-22T11:51:43.463 回答