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 と activate を呼び出しますが、何も表示されません。

self.page().history().canGoBack()編集: WebPage.history() を見つけ、次を key-b トラップに追加しました: self.page().history().back()self.page().history().back()何もしません。しかし、別のリンク start->A->B をクリックすると、では canGoBack() が実行され、ページ A に戻ります。しかし、setHtml() でロードされた元のページに戻ることはできません。

結論: WebView.setHtml() は WebPage.history にエントリを作成しません。これにより、backAction が機能しないように見える理由が説明できます...

さらに編集: Qt アシスタントでフォローアップすると、QWebFrame.setHtml() の下で、「注: このメソッドはセッションまたはグローバル履歴には影響しません...」と認めていることがわかりました。 . 実際、それは理にかなっています: 履歴項目は通常、単なる URL であるため、20K または 50K の html テキストを履歴項目として保存したくないのはそれほど奇妙ではありません。

4

1 に答える 1

1

コードの一部を削減するために、QWebView には back() スロットがあります: http://doc.qt.io/archives/qt-4.7/qwebview.html#back

それはさておき、 setHtml() を使用しても明らかに履歴エントリが作成されないことがわかったので、次の提案のいずれかを試すことができます。

履歴チェックを使用して、元に戻せるかどうかを確認してください。できれば、戻ってください。最初に表示されたページであることがわかっているため、元のソースで setHtml を再度実行できない場合。

または、ページを一時 html ファイルに書き出し、file:/// url の代わりに load() メソッドを使用します。それは歴史のエントリを作るかもしれません。

于 2012-06-28T05:55:08.070 に答える