【问题标题】:How to implement a "back" action in a QWebView/QWebPage如何在 QWebView/QWebPage 中实现“后退”操作
【发布时间】:2012-06-28 04:40:19
【问题描述】:

我有一个简单的小部件,它是 QWebView。我用 setHtml() 加载它。大多数时候这只是为了让用户可以阅读样式化的文本,但是有一些链接,如果单击一个,QWebView 会正确显示链接的页面,但现在无法返回原始页面.我想实现一个返回键快捷方式(或者可能是一个返回按钮,但问题是一样的)。而且我不知道如何告诉我的 QWebView 或其 QWebPage 这样做。一些代码尝试了我能想到的一切:

class helpDisplay(QWebView):
    def __init__(self, parent=None ):
        super(helpDisplay, self).__init__(parent)
        self.backAction = self.page().action(QWebPage.Back)
        self.backAction.setEnabled(True) # initially was False
        self.backAction.setShortcut(QKeySequence.Back) # was empty, now ctl-[
        ...
        self.setHtml(...) # big string input from a file
    ...
    def keyPressEvent(self, event): # trap keys
        if event.key() == Qt.Key_B: # temporary for testing
            self.page().triggerAction(QWebPage.Back)
            self.backAction.activate(QAction.Trigger)

这些都不会导致从链接向后导航。点击 ctl-[ 什么都不做。点击“b”进入 keyPressEvent 陷阱并调用 triggerAction 并激活,但没有任何可见的反应。

编辑:找到 WebPage.history(),并将以下内容添加到 key-b 陷阱中: self.page().history().back() 这有点工作:如果我单击链接 start->A,self.page().history().canGoBack() 为 False,self.page().history().back() 什么也不做。但是,如果我单击另一个链接 start->A->B,now 它可以GoBack() 并返回页面 A。但我无法返回使用 setHtml() 加载的原始页面.

结论:WebView.setHtml() 不会在 WebPage.history 中创建条目。这可以解释为什么 backAction 似乎不起作用...

进一步编辑:在 Qt 助手中跟进,我发现在 QWebFrame.setHtml() 下它承认,“注意:此方法不会影响会话或全局历史......”不幸的是,他们没有将该注释带回QWebPage 或 QWebView。事实上,这是有道理的:历史记录项通常只是一个 URL,因此他们不想将 20K 或 50K 的 html 文本存储为历史记录项也不足为奇。

【问题讨论】:

    标签: qt pyqt qwebview qwebpage


    【解决方案1】:

    只是为了减少你的一些代码,QWebView 确实有一个 back() 槽:http://doc.qt.io/archives/qt-4.7/qwebview.html#back

    除此之外,由于您发现使用 setHtml() 显然不会创建历史条目,您可以尝试以下建议之一:

    使用您的历史记录检查它是否可以返回。如果可以,就回去吧。如果它无法使用原始源再次运行 setHtml,因为您知道它是显示的第一页。

    或者,将您的页面写入临时 html 文件并使用 load() 方法代替 file:/// url。这可能会成为历史条目。

    【讨论】:

    • 哦,我怎么错过了?哦, back() 在插槽列表中,而不是成员。说它与view->page()->triggerPageAction(QWebPage::GoBack); 相同,这基本上是我想要做的(除了,没有“GoBack”动作名称,只有“Back”)。
    • 无论如何,谢谢。我正在努力解决您的解决方案:保留 setHtml 字符串,并在历史记录为空时重新加载它。实际上可以跟踪 linkClicked 信号以知道链接已被跟踪,因此如果后退键被击中次数过多,则知道不要进行不必要的重新加载。但我也会探索你的临时文件想法。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多