4

我们目前正在使用 QtWebKit 构建一个应用程序,其中一部分显示了我们网站的产品目录页面。在该网页上,我们使用jQuery.history插件来跟踪排序和过滤选项,而无需用户重新加载页面。

当调用 jQuery.history 的pushState()函数时,提供的 URL 被正确推送到历史记录,但即使当前 URL 已更改,也不会触发QWebView's信号(我们正在监听以更新后退/前进按钮和地址栏) 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 回答