WebEngine小部件地图示例

演示如何处理地理位置请求。

地图演示了如何处理从QWebEnginePage发起的地理位置请求。

地理位置API是一个JavaScript API,Web应用程序可以使用它来确定用户的物理位置,例如在地图上显示。由于Qt WebEngine依赖于Qt定位模块来驱动此API,因此需要在目标平台上有可行的位置后端。

为了避免意外将位置信息发送到第三方,默认情况下拒绝地理位置请求。此示例演示了应用程序必须采取的步骤才能开始接受这些请求。

注意:在Windows 11上,启用设置以授予应用程序对Windows位置服务的访问权限。在设置应用中,在隐私和安全 > 位置下,启用位置服务让应用访问您的位置让桌面应用访问您的位置

运行示例

要从Qt Creator运行示例,请打开欢迎模式并从中选择示例。有关更多信息,请访问构建和运行示例

代码

示例程序由一个名为MainWindow的单个类组成,继承自QMainWindow

#include <QMainWindow>
#include <QWebEngineView>

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

private:
    QWebEngineView *m_view;
};

在构造函数中,我们首先将QWebEngineView设置为中央小部件

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

然后我们继续将一个lambda函数连接到QWebEnginePage::featurePermissionRequested信号

    QWebEnginePage *page = m_view->page();

    connect(page, &QWebEnginePage::featurePermissionRequested,
            [this, page](const QUrl &securityOrigin, QWebEnginePage::Feature feature) {

每当网页请求使用某个功能或设备时,都会发出此信号,不仅包括位置服务,还包括音频捕获设备或鼠标锁定等。在此示例中,我们只处理对位置服务的请求

        if (feature != QWebEnginePage::Geolocation)
            return;

现在是我们真正请求用户权限的部分

        QMessageBox msgBox(this);
        msgBox.setText(tr("%1 wants to know your location").arg(securityOrigin.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) {
            page->setFeaturePermission(
                securityOrigin, feature, QWebEnginePage::PermissionGrantedByUser);
        } else {
            page->setFeaturePermission(
                securityOrigin, feature, QWebEnginePage::PermissionDeniedByUser);
        }
    });

请注意,问题中包含了网站URI的宿主部分(securityOrigin),以便告知用户确切哪个网站将接收他们的位置数据。

我们使用QWebEnginePage::setFeaturePermission方法将用户的答案传达给网页。

最后,我们请求QWebEnginePage加载可能希望使用位置服务的网页

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

示例项目 @ code.qt.io

另请参见:Qt WebEngine HTML5地理位置

© 2024 Qt公司有限公司。此处所包含的文档贡献归各自的拥有者所有。本处提供的文档遵循发布的自由软件基金会(Free Software Foundation)的条款,适用GNU自由文档许可版本1.3。Qt及其相应的标志是芬兰及/或全球其他国家的The Qt Company Ltd的商标。其他所有商标均为各自拥有者的财产。