如何在QWebView / QWebPage中实现“后退”操作

时间:2012-06-28 04:40:20

标签: qt pyqt qwebview qwebpage

我有一个简单的小部件,它是一个QWebView。我用setHtml()加载它。大多数情况下这只是用户可以阅读样式文本,但是有一些链接,如果单击一个,QWebView正确显示链接页面,但现在无法返回到原始页面。我想实现一个Back键快捷键(或者可能是一个Back按钮,但问题是一样的)。我无法弄清楚如何告诉我的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()。历史()。回() 这种方式有效:如果我点击链接开始 - > A,self.page().history().canGoBack()为假,self.page().history().back()什么都不做。但是,如果我点击另一个链接start-> A-> B,现在它可以GoBack()并返回到页面A.但是我不能回到加载了setHtml的原始页面()。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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