我们目前正在使用QtWebKit构建一个应用程序,其中一部分显示了我们网站的产品目录页面.在该网页上,我们使用
jQuery.history插件来跟踪排序和过滤选项,而无需用户重新加载页面.
当调用jQuery.history的pushState()函数时,提供的URL被正确地推送到历史记录中,但是QWebView的urlChanged()信号(我们正在监听更新后退/前进按钮和地址栏)不会被触发,即使当前网址已更改.我只能假设这是因为没有点击任何链接,也没有页面重新加载所以Qt认为它不需要做任何与URL相关的事情.
有没有办法检测通过QtWebKit中的HTML5历史API进行的URL更改,还是我遗漏了一些明显的东西?
最佳答案 有
QWebPage::saveFrameStateRequested信号:
This signal is emitted shortly before the history of navigated pages in frame is changed, for example when navigating back in the history.
您可以使用它来跟踪历史记录更改:
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示例screenshot.