4

我有一个简单的小部件,它是 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,现在它可以GoBack() 并返回页面 A。但我无法返回使用 setHtml() 加载的原始页面。

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

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

4

1 回答 1

1

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

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

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

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

于 2012-06-28T05:55:08.070 回答