Qt WebKit and HTML5 geolocation
I am learning HTML5 and testing new features in a Qt hybrid application. Now I'm working on a simple geolocation example, but when I call navigator.geolocation.getCurrentPosition (displayLocation); QtWebKit doesn't seem to support it, but according to this http://trac.webkit.org/wiki/QtWebKitFeatures22 the version of QtWebKit that ships with Qt4.8.0 does support geolocation.
This is the code Im using:
window.onload = function()
{
getMyLocation();
}
function getMyLocation()
{
if(navigator.geolocation)
{
navigator.geolocation.getCurrentPosition(displayLocation);
}
else
{
alert("No geolocation support");
}
}
function displayLocation(position)
{
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
var div = document.getElementById("location");
div.innerHTML = "You are at Latitude: " + latitude + ", Longitude: " + longitude;
}
And on the Qt side:
QWebView* MyWindow::createWebView()
{
QWebSettings* default_settings = QWebSettings::globalSettings();
default_settings->setAttribute(QWebSettings::JavascriptEnabled,true);
default_settings->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled,true);
default_settings->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled,true);
default_settings->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls,true);
default_settings->setAttribute(QWebSettings::LocalStorageEnabled,true);
default_settings->setAttribute(QWebSettings::JavascriptCanAccessClipboard,true);
default_settings->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);
QWebView* web_view = new QWebView(this);
connect(web_view->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
this, SLOT(addJavascriptObject()));
inspector_->setPage(web_view->page());
inspector_->setVisible(true);
inspector_->show();
web_view->load(QUrl("qrc:/html/geolocation_example.html"));
return web_view;
}
Does anyone know how to enable Html5 geolocation for a Qt desktop application?
source to share
You need to subclass QWebPage
and make a signal handler for the signal QWebPage::featurePermissionRequested(QWebFrame*, QWebPage::Feature)
.
Here's a reference implementation:
class WebPage : public QWebPage
{
Q_OBJECT
public:
WebPage(QObject* parent = 0) :
QWebPage(parent)
{
connect(this, SIGNAL(featurePermissionRequested(QWebFrame*, QWebPage::Feature)), SLOT(permissionRequested(QWebFrame*, QWebPage::Feature)));
}
virtual ~WebPage()
{
}
private slots:
void permissionRequested(QWebFrame* frame, QWebPage::Feature feature)
{
setFeaturePermission(frame, feature, PermissionGrantedByUser);
}
};
Use QWebView::setPage()
with an instance of your newly created subclass so that QtWebKit uses your implementation QWebPage
.
If you need more help take a look QtMiniBrowser
, which is part of the WebKit.org repository. Source code is available here http://trac.webkit.org/browser/trunk/Tools/QtTestBrowser
source to share