2012-06-28 2 views
4

QWebView 인 간단한 위젯이 있습니다. setHtml()을 사용하여로드합니다. 대부분의 경우 이것은 사용자가 스타일이 지정된 텍스트를 읽을 수 있도록하기위한 것이지만 몇 개의 링크가 있으며 클릭하면 QWebView가 링크 된 페이지를 제대로 표시하지만 이제 원래 페이지로 돌아갈 방법이 없습니다. . 뒤로 키 바로 가기 (또는 뒤로 버튼을 구현하고 싶지만 문제는 동일합니다). 그리고 QWebView 또는 QWebPage에이를 알리는 방법을 알 수 없습니다. 일부 코드는 내가 생각할 수있는 모든 것을 시도합니다 :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을 호출하고 활성화되지만 아무 것도 표시되지 않습니다.

편집 :하여 키-B 트랩에 다음 WebPage.history()를 발견하고, 추가 :.. self.page() 다시 역사를()() 를이 좀 작동 : 내가 링크 시작 -를 클릭하면 > A, self.page().history().canGoBack()은 False이고 self.page().history().back()은 아무 것도 수행하지 않습니다. 그러나 다른 링크 시작 -> A -> B를 클릭하면 이 이제 canGoBack() 및 페이지 A로 되돌아갑니다. 그러나 setHtml()을 사용하여로드 된 원래 페이지로 돌아갈 수 없습니다.

결론 : WebView.setHtml()은 WebPage.history에 항목을 만들지 않습니다. 이것은 backAction이 작동하지 않는 이유를 설명 할 수 있습니다 ...

추가 편집 : Qt Assistant에서 다음을 수행하면 QWebFrame.setHtml()에서 확인할 수 있습니다. "참고 :이 메서드는 세션이나 전역에 영향을 미치지 않습니다. 역사 ... "불행히도 그들은 QWebPage 또는 QWebView에 그 메모를 다시 가지지 않았습니다. 실제로 그것은 이치에 맞습니다. 이력 항목은 보통 URL 일 뿐이므로 이력 항목으로 20KB 또는 50KB의 html 텍스트를 저장하고 싶지 않을 정도로 이상하지 않습니다.

답변

1

일부 코드를 줄이기 위해 QWebView에는 back() 슬롯이 있습니다 (http://doc.qt.io/archives/qt-4.7/qwebview.html#back).

당신이 setHtml (의 사용) 분명히 기록 항목을 작성하지 않는 것을 발견했기 때문에, 당신은 이러한 제안 중 하나를 시도 할 수 제쳐두고, :

는 돌아갈 수 있는지 확인하기 위해 귀하의 역사 수표를 사용하여 . 가능한 경우 되돌아 가십시오. 원래의 소스를 가지고 setHtml을 다시 실행할 수 없다면, 그것이 첫 번째 페이지라는 것을 알고 있기 때문입니다.

또는 임시 html 파일에 페이지를 작성하고 file : /// url 대신 load() 메소드를 사용하십시오. 그것은 역사 입력을 만들 수 있습니다.

+0

오, 어떻게 알 수 있을까요? 오, back()은 멤버가 아닌 슬롯 목록에 있습니다. 'view-> page() -> triggerPageAction (QWebPage :: GoBack);과 동일하다. (기본적으로 "GoBack"액션 이름, "Back"만 제외). – user405

+0

어쨌든, 감사합니다. 나는 주위에 setHtml 문자열을 유지하고 히스토리가 비어있을 때 다시로드한다. 실제로 linkClicked 신호를 추적하여 링크가 추적되었다는 것을 알 수 있습니다. 따라서 뒤로 키가 추가 횟수만큼 누를 경우 불필요한 재로드를 수행하지 않아도됩니다. 하지만 임시 파일 아이디어도 탐색 할 것입니다. – user405