Как реализовать действие "назад" в 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. Это может сделать запись в истории.