4

現在、QtWebKit を使用してアプリケーションを構築しています。その一部には、Web サイトの製品カタログ ページが表示されます。その Web ページでは、jQuery.historyプラグインを使用して、ユーザーがページをリロードする必要なく、並べ替えとフィルタリングのオプションを追跡しています。

jQuery.history のpushState()関数が呼び出されると、提供された URL は適切に履歴にプッシュされますが、現在の URL が変更されたにもかかわらず、(戻る/進むボタンとアドレス バーを更新するためにリッスンしている)QWebViewのシグナルは発生しません。 urlChanged(). これは、リンクがクリックされなかったか、ページのリロードがなかったため、Qt が URL 関連の操作を行う必要がないと判断したためだと推測できます。

QtWebKit の HTML5 履歴 API を介して行われた URL の変更を検出する方法はありますか?

4

1 に答える 1

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 Browserの例のスクリーンショット

于 2013-04-24T02:29:17.313 に答える