当用户在QWebView小部件中用鼠标滚动时,我是否知道他是否到达了网页内容的头部/末尾?
我可以放置一个QWebView :: wheelEvent(),但我怎么知道滚动位置?
谢谢!
答案 0 :(得分: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";
答案 1 :(得分:0)
当滚动位置发生变化时,我在搜索实际的信号时发现了这个问题。
可以使用QWebPage::scrollRequested
信号。 documentation says 只要rectToScroll给出的内容需要滚动dx和dy向下并且没有设置视图,就会发出此信号。 ,但最后一部分是错了,信号实际上总是发出。
我contributed为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)