WebEngine Widgets Karten Beispiel

Zeigt, wie Geolokalisierungsanfragen behandelt werden.

Maps demonstriert den Umgang mit Geolocation-Anfragen, die von einer QWebEnginePage stammen.

Bei der Geolocation-API handelt es sich um eine JavaScript-API, mit der Webanwendungen den physischen Standort des Benutzers ermitteln können, um ihn z. B. auf einer Karte anzuzeigen. Da Qt WebEngine sich auf das Qt Positioning Modul angewiesen ist, um diese API zu betreiben, wird ein praktikables Standort-Backend für die Zielplattform benötigt.

Um zu vermeiden, dass versehentlich Standortinformationen an Dritte gesendet werden, werden Geolokalisierungsanfragen standardmäßig verweigert. Dieses Beispiel zeigt, welche Schritte eine Anwendung unternehmen muss, um diese Anfragen zu akzeptieren.

Hinweis: Aktivieren Sie unter Windows 11 die Einstellungen, um der Anwendung Zugriff auf die Windows-Standortdienste zu gewähren. Aktivieren Sie in der App "Einstellungen" unter Privacy & Security > Location Location services , Let apps access your location und Let desktop apps access your location.

Ausführen des Beispiels

Zum Ausführen des Beispiels von Qt Creatorzu starten, öffnen Sie den Modus Welcome und wählen Sie das Beispiel unter Examples aus. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.

Der Code

Das Beispielprogramm besteht aus einer einzigen Klasse, MainWindow, die von QMainWindow erbt:

#include <QMainWindow>
#include <QWebEngineView>

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

private:
    QWebEngineView *m_view;
};

Im Konstruktor richten wir zunächst QWebEngineView als zentrales Widget ein:

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

Dann verbinden wir eine Lambda-Funktion mit dem Signal QWebEnginePage::permissionRequested:

    QWebEnginePage *page = m_view->page();

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

Dieses Signal wird immer dann ausgegeben, wenn eine Webseite eine bestimmte Funktion oder ein bestimmtes Gerät anfordert, darunter nicht nur Ortungsdienste, sondern beispielsweise auch Audioaufnahmegeräte oder Mausverriegelungen. In diesem Beispiel behandeln wir nur Anfragen für Standortdienste:

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

Jetzt kommt der Teil, in dem wir den Benutzer tatsächlich um Erlaubnis bitten:

        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();
    });

Beachten Sie, dass die Frage die Host-Komponente des URI der Website enthält (permission.origin()), um den Benutzer darüber zu informieren, welche Website seine Standortdaten erhält.

Wir verwenden die Methoden QWebEnginePermission::grant() und QWebEnginePermission::deny(), um die Antwort des Benutzers an die Webseite zurück zu übermitteln.

Schließlich bitten wir die QWebEnginePage, die Webseite zu laden, die die Standortdienste nutzen möchte:

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

Beispielprojekt @ code.qt.io

Siehe auch Qt WebEngine HTML5 Geolocation.

© 2025 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.