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"))); }
另请参见:Qt WebEngine HTML5地理位置。
© 2024 Qt公司有限公司。此处所包含的文档贡献归各自的拥有者所有。本处提供的文档遵循发布的自由软件基金会(Free Software Foundation)的条款,适用GNU自由文档许可版本1.3。Qt及其相应的标志是芬兰及/或全球其他国家的The Qt Company Ltd的商标。其他所有商标均为各自拥有者的财产。