Zoom with QPinchGesture in QWebView with Google Maps
-
Hi
I am working on an application for touch screen devices using Google Maps functionality.
So far I have been able to insert the map using a QWebView and loading an html file containing Javascipt.
Currently, the user can perform panning in the map using finger strokes and/or the control buttons in Google Maps. Zooming can also be performed using the control buttons integrated in the map.What I now want, and is struggeling with, is being able to zoom in the map using pinching with the fingers. I have researched the web, and found several methods, but I can't seem to get it working. This is the code I have now:
mainwindow.h
@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtWebKit/QtWebKit>
#include <QtWebKit/QWebElement>
#include <QtWebKitWidgets/QWebPage>
#include <QWebFrame>
#include <QGestureEvent>
#include <QPinchGesture>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{
Q_OBJECTpublic:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();public slots:
void on_btnMyLocation_clicked();private slots:
void linkClicked(const QUrl &url);protected:
bool event(QEvent* event);private:
Ui::MainWindow *ui;
bool gestureEvent(QGestureEvent event);
void pinchTriggered(QPinchGesture);
void printLatLong();
};#endif // MAINWINDOW_H
@mainwindow.cpp
@
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->webView->grabGesture(Qt::PinchGesture);
ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
ui->webView->setAttribute(Qt::WA_AcceptTouchEvents, false);
connect( ui->webView, SIGNAL(linkClicked(const QUrl &)), this, SLOT(linkClicked(const QUrl &)), Qt::DirectConnection);
ui->webView->load(QUrl("file:///C:/Qt/Qt5.1.0/Tools/QtCreator/bin/MapTestQt/google_maps.html"));// Calling method for printing Latitude and Longitude printLatLong();
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::event(QEvent event)
{
if(event->type() == QEvent::Gesture)
{
return gestureEvent(static_cast<QGestureEvent>(event));
}
return QWidget::event(event);
}bool MainWindow::gestureEvent(QGestureEvent *event)
{
if(QGesture *pinch = event->gesture(Qt::PinchGesture))
{
pinchTriggered(static_cast<QPinchGesture *>(pinch));
}
return true;
}void MainWindow::pinchTriggered(QPinchGesture* gesture)
{
QWheelEvent wheelEvent(gesture->centerPoint().toPoint(), gesture->scaleFactor() - gesture->lastScaleFactor(), Qt::NoButton, Qt::NoModifier);
QApplication::sendEvent(this, &wheelEvent);
}void MainWindow::linkClicked(const QUrl &url)
{
ui->webView->load(url);
}void MainWindow::on_btnMyLocation_clicked()
{
// Calling method for printing Latitude and Longitude
printLatLong();
}
void MainWindow::printLatLong(){
// Creating QVariant variable
QVariant lat;
// Getting my latitude from javascript method
lat = ui->webView->page()->mainFrame()->evaluateJavaScript("returnLatitude()");
// Printing my latitude to label
ui->labMyLatitude->setText(lat.toString());// Creating QVariant variable QVariant lng; // Getting my longitude from javascript method lng = ui->webView->page()->mainFrame()->evaluateJavaScript("returnLongitude()"); // Printing my longitude to label ui->labMyLongitude->setText(lng.toString());
}
@With this code, no interaction with the map works at all using touch events (mouse works), but when I comment out line 10 in mainwindow.cpp (ui->webView->grabGesture), it works like described above.
Also, as an aditional question: In my Javascript, navigator.geolocation returns false. Do I have to set any special permission in the QWebView?
Thanks for any help.