Как реализовать действие "назад" в QWebView/QWebPage

У меня есть простой виджет, который является 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(), и добавил следующее в ловушку ключа-b: self.page(). History(). Back() Это работает: если я нажимаю ссылку start->A, self.page().history().canGoBack() является ложным и self.page().history().back() ничего не делает. Однако, если я нажимаю другую ссылку start->A->B, теперь она может выполнить GoBack() и возвращается на страницу A. Но я не могу вернуться к исходной странице, загруженной с помощью setHtml().

Вывод: WebView.setHtml() не создает запись в WebPage.history. Это может объяснить, почему backAction не работает...

Дальнейшее редактирование: В Qt Assistant я обнаружил, что в QWebFrame.setHtml() он допускает: "Примечание: этот метод не влияет на сессию или глобальную историю..." К сожалению, они не перенесли эту заметку обратно в QWebPage или QWebView., На самом деле это имеет смысл: элемент истории обычно представляет собой просто URL-адрес, поэтому не исключено, что они не захотят хранить 20К или 50К HTML-текста в качестве элемента истории.

1 ответ

Просто чтобы уменьшить часть вашего кода, в QWebView есть слот back(): http://doc.qt.io/archives/qt-4.7/qwebview.html.

Помимо этого, поскольку вы обнаружили, что использование setHtml(), по-видимому, не создает запись истории, вы можете попробовать одно из следующих предложений:

Используйте свою проверку истории, чтобы увидеть, может ли она вернуться. Если это возможно, вернитесь. Если он не может запустить setHtml снова с вашим исходным источником, так как вы знаете, что это была первая отображаемая страница.

Или запишите свои страницы во временный HTML-файл и используйте метод load() для файла:/// url. Это может сделать запись в истории.

Другие вопросы по тегам