gpt4 book ai didi

c++ - 如何让 QML map 流量通过代理,并为程序的其余部分禁用该代理?

转载 作者:行者123 更新时间:2023-11-30 04:50:08 26 4
gpt4 key购买 nike

我有一个应用程序使用本地网络与某些设备通信,并使用 http 代理来获取任何外部内容。我想在其中使用 map 插件。现在 map 需要一个 http 代理来下载瓦片。如果我使用 http_proxy 变量设置全局 Qt 代理设置,或者使用 QNetworkProxy::setApplicationProxy 手动设置,则 map 加载正常,但程序的其余部分中断。如果我禁用代理,那么我可以与我的设备通话,但我看不到 map 。我已尝试使用 QQmlNetworkAccessManagerFactory,如示例 here 中所述, 它适用于 Image 类型的对象,如 view.qml 中所定义,但如果我将 Image 替换为包含我的 map 的 Item,它就不起作用。

Item{
width: 500
height: 500
Map {
Plugin {
id: mapPlugin
name: "osm"
}
anchors.fill: parent
plugin: mapPlugin
center: QtPositioning.coordinate(59.91, 10.75)
zoomLevel: 14
visible: true
}
}

MyNetworkAccessManagerFactory::create 方法从未被调用,我收到以下错误:QGeoTileRequestManager:5 次无法获取图 block (17366,9541,15),放弃。最后一条错误消息是:“传输 http://c.tile.openstreetmap.org/15/17366/9541.png 时出错 - 服务器回复:服务不可用”。可能是什么原因造成的?以及如何为 map 插件设置 QNetworkProxy?

最佳答案

您必须修改插件的源代码:

src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp
src/plugins/geoservices/osm/qgeoroutingmanagerengineosm.cpp
src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp
src/plugins/geoservices/osm/qplacemanagerengineosm.cpp

在每个文件中都有一个 QNetworkAccessManager,因此您必须添加以下代码:

#include <QtNetwork/QNetworkProxy>

// ...
// constructor

QString proxy = parameters.value(QStringLiteral("proxy")).toString();
if (!proxy.isEmpty()) {
#ifndef QT_NO_NETWORKPROXY
if (proxy.toLower() != QStringLiteral("system")) {
QUrl proxyUrl(proxy);
if (proxyUrl.isValid()) {
qDebug() << "Setting proxy to " << proxyUrl.toString();
m_networkManager->setProxy(
QNetworkProxy(QNetworkProxy::HttpProxy,
proxyUrl.host(),
proxyUrl.port(8080),
proxyUrl.userName(),
proxyUrl.password()));
}
} else if (QNetworkProxy::applicationProxy().type() == QNetworkProxy::NoProxy) {
QNetworkProxyFactory::setUseSystemConfiguration(true);
qDebug() << "Setting system proxy.";
}
#else
qDebug() << "No proxy support";
#endif
} else {
qDebug() << "No proxy parameter specified.";
}

我创建了一个 .patch 来简化更新,因为它可以从 here 下载。 .

然后将端点放入文件夹src/plugins/geoservices/osm,应用补丁,编译并安装如下:

git clone -b 5.12.1 git@github.com:qt/qtlocation.git
cd qtlocation/src/plugins/geoservices/osm
wget https://raw.githubusercontent.com/eyllanesc/stackoverflow/master/questions/55105933/proxy-osm.patch
git apply proxy-osm.patch
qmake
make
sudo make install

然后您可以使用插件参数使用代理:

Map {
Plugin {
id: mapPlugin
name: "osm"
PluginParameter { name: "proxy"; value: "http://179.179.253.147:8080" } // <---
}
anchors.fill: parent
plugin: mapPlugin
center: QtPositioning.coordinate(59.91, 10.75)
zoomLevel: 14
visible: true
}

关于c++ - 如何让 QML map 流量通过代理,并为程序的其余部分禁用该代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com