Sur cette page

Exemple de cartes des widgets WebEngine

Démontre comment traiter les demandes de géolocalisation.

Application Maps indiquant la géolocalisation

Maps montre comment traiter les demandes de géolocalisation provenant de QWebEnginePage.

L'API de géolocalisation est une API JavaScript que les applications web peuvent utiliser pour déterminer l'emplacement physique de l'utilisateur et l'afficher sur une carte, par exemple. Comme Qt WebEngine s'appuie sur le module Qt Positioning pour alimenter cette API, un backend de géolocalisation viable est nécessaire pour la plateforme cible.

Pour éviter d'envoyer accidentellement des informations de localisation à des tiers, les demandes de géolocalisation sont refusées par défaut. Cet exemple montre les étapes qu'une application doit suivre pour commencer à accepter ces demandes.

Remarque : sous Windows 11, activez les paramètres permettant à l'application d'accéder aux services de localisation de Windows. Dans l'application Paramètres, sous Privacy & Security > Location, activez Location services, Let apps access your location et Let desktop apps access your location.

Exécution de l'exemple

Pour exécuter l'exemple à partir de Qt Creator, ouvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.

Le code

Le programme d'exemple consiste en une seule classe, MainWindow, qui hérite de QMainWindow:

#include <QMainWindow>
#include <QWebEngineView>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);

private:
    QWebEngineView *m_view;
};

Dans le constructeur, nous définissons d'abord le QWebEngineView comme widget central :

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , m_view(new QWebEngineView(this))
{
    setCentralWidget(m_view);

Nous connectons ensuite une fonction lambda au signal QWebEnginePage::permissionRequested:

    QWebEnginePage *page = m_view->page();

    connect(page, &QWebEnginePage::permissionRequested, [this](QWebEnginePermission permission) {

Ce signal est émis chaque fois qu'une page web demande à utiliser une certaine fonctionnalité ou un certain dispositif, y compris non seulement les services de localisation, mais aussi les dispositifs de capture audio ou le verrouillage de la souris, par exemple. Dans cet exemple, nous ne traitons que les demandes de services de localisation :

        if (permission.permissionType() != QWebEnginePermission::PermissionType::Geolocation)
            return;

Il s'agit maintenant de demander la permission à l'utilisateur :

        QMessageBox msgBox(this);
        msgBox.setText(tr("%1 wants to know your location").arg(permission.origin().host()));
        msgBox.setInformativeText(tr("Do you want to send your current location to this website?"));
        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
        msgBox.setDefaultButton(QMessageBox::Yes);

        if (msgBox.exec() == QMessageBox::Yes)
            permission.grant();
        else
            permission.deny();
    });

Notez que la question inclut le composant hôte de l'URI du site web (permission.origin()) pour informer l'utilisateur sur le site web qui recevra ses données de localisation.

Nous utilisons les méthodes QWebEnginePermission::grant() et QWebEnginePermission::deny() pour communiquer la réponse de l'utilisateur à la page web.

Enfin, nous demandons à QWebEnginePage de charger la page web susceptible d'utiliser les services de localisation :

    page->load(QUrl(QStringLiteral("https://bing.com/maps")));
}

Exemple de projet @ code.qt.io

Voir aussi Qt WebEngine HTML5 Geolocation.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.