2013-04-23 8 views
4

현재 QtWebKit을 사용하여 응용 프로그램을 제작하고 있습니다. 일부는 웹 사이트의 제품 카탈로그 페이지를 표시합니다. 이 웹 페이지에서는 사용자가 페이지를 다시로드 할 필요없이 정렬 및 필터링 옵션을 추적하기 위해 jQuery.history 플러그인을 사용하고 있습니다.QtWebKit : HTML5 기록 API를 통해 변경된 URL을 검색하는 방법은 무엇입니까?

jQuery.history의 pushState() 기능은 발사되지 않는다 (우리는 뒤로/앞으로 버튼과 주소 표시 줄을 업데이트하는 듣고있는)을 제대로 역사에 밀려 제공하는 URL 만 QWebViewurlChanged() 신호를 호출하면 현재 URL이 변경 되었더라도 나는 링크가 클릭되지 않았거나 페이지를 새로 고침해서 Qt가 URL과 관련된 작업을 수행 할 필요가 없다고 생각하기 때문에 이것을 가정 할 수 있습니다.

QtWebKit에서 HTML5 기록 API를 통해 이루어진 URL 변경을 감지하는 방법이 있습니까? 아니면 확실하지 않은 것이 있습니까?

+0

AFAIR을 사용하면 jObject에 QObject를 삽입하고 신호와 슬롯을 사용할 수 있습니다. 여기에서 [docs] (http://qt-project.org/doc/qt-4.8/qwebframe.html#addToJavaScriptWindowObject)를 발견했습니다. 또한 [this] (http://www.developer.nokia.com/Community/Wiki/Exposing_QObjects_to_Qt_Webkit) 및 [this] (http://www.developer.nokia.com/Community/Wiki/Connecting_to_a_QObjects_signal_with_JavaScript_slot_in_Qt_WebKit). – gatto

+0

"브라우저"를 작동시키기 위해 웹 사이트를 변경하지는 않겠지 만, 이는 최후의 수단으로 선택할 수있는 확실한 옵션입니다. – Davecheesefish

+0

자바 스크립트 삽입 기능이 포함되어 있습니까? 원래 웹 사이트는 여전히 동일하지만 "브라우저"는 qobjects에 "userscripts"를 삽입하고 jquery.history에 코드를 연결합니다. – gatto

답변

2

QWebPage::saveFrameStateRequested 신호가이 신호는 다시 역사에서 탐색 할 때 프레임의 탐색 페이지의 역사는, 예를 들어, 변경 직전에 방출되는

.

당신은 역사의 변화를 추적하는 데 사용할 수 있습니다 :

void MainWindow::saveFrameStateRequested(QWebFrame *frame, QWebHistoryItem *item) { 
    // this slot is executed before the history is changed, 
    // so we need to wait a bit: 
    QTimer::singleShot(100, this, SLOT(listHistoryItems())); 
} 

void MainWindow::listHistoryItems() { 
    for (QWebHistoryItem historyItem: view->page()->history()->items()) { 
     qDebug() << "item" << historyItem.url() << historyItem.title(); 
    } 
} 

void MainWindow::finishLoading(bool) { 
    // (re)connect the signal to track history change, 
    // maybe there is a better place to connect this signal 
    // where disconnect won't be needed 
    disconnect(view->page(), SIGNAL(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*)), 
      this, SLOT(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*))); 

    connect(view->page(), SIGNAL(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*)), 
      this, SLOT(saveFrameStateRequested(QWebFrame*,QWebHistoryItem*))); 
} 

수정 Fancy Browserscreenshot.

+0

매력처럼 작동합니다, 대단히 감사합니다! – Davecheesefish