Merge branch 'main' of http://123.57.54.1:3000/CaoYuhui/PayloadAPP into WuChengBo

pull/7/head
cbwu 7 months ago
commit 0e2f84924c

@ -1,104 +0,0 @@
QT += core gui webenginewidgets
QT += network
QT += quickwidgets qml
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# CONFIG += console
QMAKE_PROJECT_DEPTH = 0
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
# Src/GDDC/gddcCmdDlg.cpp \
# Src/GDDC/gddcSet.cpp \
# Src/GDDC/gddcStateInfo.cpp \
# Src/HomePage/homepagesetingwidget.cpp \
# cffmpeg_decode.cpp \
# customwebenginepage.cpp \
# cwebengineview.cpp \
# encodemodelcamera.cpp \
# ffmpegvideodlg.cpp \
# Src/GDDC/gddcdlg.cpp \
SDFPDlg.cpp \
global.cpp \
# Src/HomePage/homepagedlg.cpp \
main.cpp \
mainwindow.cpp \
# modelcameradlg.cpp \
# qweb.cpp \
# rescueload.cpp \
# rescueloadwidget.cpp
HEADERS += \
# DCFrameCkCmd.h \
# Src/GDDC/gddcCmdDlg.h \
# Src/GDDC/gddcSet.h \
# Src/GDDC/gddcStateInfo.h \
# Src/GDDC/structDefineMyslef.h \
# Src/HomePage/homepagesetingwidget.h \
# cffmpeg_decode.h \
# customwebenginepage.h \
# cwebengineview.h \
# encodemodelcamera.h \
# ffmpegvideodlg.h \
# Src/GDDC/gddcdlg.h \
SDFPDlg.h \
global.h \
# Src/HomePage/homepagedlg.h \
mainwindow.h \
# modelcameradlg.h \
# qweb.h \
# rescueload.h \
# rescueloadwidget.h
FORMS += \
# Src/GDDC/gddcCmdDlg.ui \
# Src/GDDC/gddcSet.ui \
# Src/GDDC/gddcStateInfo.ui \
# Src/HomePage/homepagesetingwidget.ui \
# ffmpegvideodlg.ui \
# Src/GDDC/gddcdlg.ui \
# Src/HomePage/homepagedlg.ui \
SDFPDlg.ui \
mainwindow.ui \
# modelcameradlg.ui \
# qweb.ui \
# rescueloadwidget.ui
TRANSLATIONS += \
PayloadAPP_zh_CN.ts
CONFIG += lrelease
CONFIG += embed_translations
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
RESOURCES += \
mainwindow.qrc \
# map/places_map.qrc
DISTFILES += \
config.ini \
res/Qss/qss.qss \
style.qss
INCLUDEPATH += $$PWD/ffmpeg/include \
$$PWD/Src/Video/
LIBS += -L$$PWD/ffmpeg/lib \
-lavcodec -lavdevice -lavfilter -lavformat -lavutil -lpostproc \
-lswresample -lswscale
include($$PWD/Src/HomePage/HomePage.pri)
include($$PWD/Src/WebPage/WebPage.pri)
include($$PWD/Src/ModelCamera/ModelCamera.pri)
include($$PWD/Src/RescueLoad/RescueLoad.pri)
include($$PWD/Src/GDDC/GDDC.pri)
include($$PWD/Src/Video/Video.pri)

@ -1,3 +1,4 @@
QT *= location location-private positioning-private qml positioning sql network core5compat quick
SOURCES += \ SOURCES += \
$$PWD/rescueload.cpp \ $$PWD/rescueload.cpp \
$$PWD/rescueloadwidget.cpp \ $$PWD/rescueloadwidget.cpp \
@ -11,3 +12,9 @@ FORMS += \
RESOURCES += \ RESOURCES += \
$$PWD/map/places_map.qrc $$PWD/map/places_map.qrc
# 指定库文件的头文件路径
INCLUDEPATH += $$PWD/map/tianditu/include
# 指定库文件的路径
LIBS += -L$$PWD/map/tianditu/lib -lTianDiTu

@ -7,44 +7,50 @@ import QtPositioning
import QtLocation import QtLocation
//! [Imports] //! [Imports]
MapView { Map{
anchors.fill: parent anchors.fill: parent
id: mapview id: map //! [Initialize Plugin]
//! [Initialize Plugin] plugin: Plugin {
map.plugin: Plugin {
id: myPlugin id: myPlugin
name: "osm" name: "TiMap"
//specify plugin parameters if necessary
PluginParameter {
name: "osm.mapping.providersrepository.disabled"
value: "true"
} }
PluginParameter { center: QtPositioning.coordinate(37.8564642, 107.4229819)
name: "osm.mapping.providersrepository.address"
value: "http://maps-redirect.qt.io/osm/5.6/"
}
//PluginParameter {...} zoomLevel: 4
//... minimumZoomLevel: 2
maximumZoomLevel: 18
onZoomLevelChanged: {
if (zoomLevel < minimumZoomLevel) {
zoomLevel = minimumZoomLevel
} }
map.activeMapType: map.supportedMapTypes[map.supportedMapTypes.length - 2] if (zoomLevel > maximumZoomLevel) {
map.center: QtPositioning.coordinate(30.67, 120.07) zoomLevel = maximumZoomLevel
map.zoomLevel: 10 }
// map.activeMapType: MapType.HybridMap }
// map.onSupportedMapTypesChanged: {
// map.activeMapType = map.supportedMapTypes[map.supportedMapTypes.length - 1]
// }
// Component.onCompleted: {console.log(map.supportedMapTypes)} // Component.onCompleted: {console.log(map.supportedMapTypes)}
Component.onCompleted: updateActiveMapType(map,"Tianditu Street");
//
function updateActiveMapType(control,para) {
for (var i = 0; i < control.supportedMapTypes.length; i++) {
console.log(control.supportedMapTypes[i].name)
if (para === control.supportedMapTypes[i].name) {
control.activeMapType = control.supportedMapTypes[i]
return
}
}
}
// //
// signal locationClicked(string imsi) // signal locationClicked(string imsi)
signal indexClicked(int row) signal indexClicked(int row)
MapItemView { MapItemView {
id: itemview id: itemview
parent: mapview.map parent: map
// model: testModel // model: testModel
model: imsiDataModel model: imsiDataModel
z:2 z:2
@ -100,7 +106,7 @@ MapView {
} }
MapItemView { MapItemView {
parent: mapview.map parent: map
// model: testModel // model: testModel
model: listSelectModel model: listSelectModel
z:3 z:3
@ -127,44 +133,79 @@ MapView {
} }
} }
} }
// // // //
Connections {
target: imsiDataModel
function onDataCleared() {
listSelectModel.clear()
map.zoomLevel = 5
}
}
// // ,
Connections { Connections {
target: imsiSelectModel target: imsiSelectModel
function onSelectionChanged (selected, deselected) { function onSelectionChanged (selected, deselected) {
updateSelect(imsiSelectModel)
}
}
Connections {
target: imsiDataModel
function onDataChanged(topLeft, bottomRight,roles) {
updateSelect(imsiSelectModel)
}
}
function updateSelect(imsiSelectModel) {
var indexs = imsiSelectModel.selectedIndexes var indexs = imsiSelectModel.selectedIndexes
console.log(indexs)
// if (indexs.length === 0) { // if (indexs.length === 0) {
listSelectModel.clear() listSelectModel.clear()
// } // }
if (indexs.length === 0) return;
var minLat = 999;
var maxLat = -999;
var minLon = 999;
var maxLon = -999;
for (var i = 0; i<indexs.length; i++){ for (var i = 0; i<indexs.length; i++){
if (indexs[i].column === 0) { if (indexs[i].column === 0) {
var latitude = Number(imsiDataModel.data(indexs[i], imsiDataModel.getRole("latitude")))
var longitude = Number(imsiDataModel.data(indexs[i], imsiDataModel.getRole("longitude")))
if (latitude < minLat) minLat = latitude;
if (latitude > maxLat) maxLat = latitude;
if (longitude < minLon) minLon = longitude;
if (longitude > maxLon) maxLon = longitude;
listSelectModel.append({ listSelectModel.append({
"latitude": imsiDataModel.data(indexs[i], imsiDataModel.getRole("latitude")), // 258 "latitude": latitude, // 258
"longitude": imsiDataModel.data(indexs[i], imsiDataModel.getRole("longitude")) //257 "longitude": longitude //257
});// 258); });// 258);
} }
} }
} var centerLat = (minLat + maxLat) / 2.;
} console.log(minLat, maxLat, )
var centerLon = (minLon + maxLon) / 2.;
// Connections { var latDiff = maxLat - minLat;
// target: imsiDataModel var lonDiff = maxLon - minLon;
// function onDetailUpdated (imsi, longitude, latitude){ var maxDiff = Math.max(latDiff, lonDiff);
// listSelectModel.clear()
// listSelectModel.append({"imsi":imsi, "latitude": latitude, "longitude": longitude});
// console.log(listSelectModel.length)
// }
// }
// MouseArea { //
// anchors.fill: parent if (maxDiff < 0.01) {
// hoverEnabled: false map.zoomLevel = 15;
// propagateComposedEvents: true } else if (maxDiff < 0.1) {
// onClicked: { map.zoomLevel = 12;
// listSelectModel.clear() } else if (maxDiff < 1) {
// mouse.accepted() map.zoomLevel = 10;
// } } else {
// } map.zoomLevel = 5;
}
map.center = QtPositioning.coordinate(centerLat, centerLon);
}
// //
@ -173,7 +214,7 @@ MapView {
id: mapHoverHandler id: mapHoverHandler
acceptedDevices: PointerDevice.Mouse acceptedDevices: PointerDevice.Mouse
onPointChanged: { onPointChanged: {
var position = mapview.map.toCoordinate(point.position) var position = map.toCoordinate(point.position)
coordinatesDisplay.latitude = position.latitude coordinatesDisplay.latitude = position.latitude
coordinatesDisplay.longitude = position.longitude coordinatesDisplay.longitude = position.longitude
} }
@ -197,5 +238,124 @@ MapView {
verticalAlignment: Text.AlignBottom // verticalAlignment: Text.AlignBottom //
} }
} }
//
Map {
id: overlay_map
anchors.fill: parent
plugin: Plugin {
name: "TiMap"
}
center: parent.center
color: 'transparent' // Necessary to make this map transparent
minimumFieldOfView: parent.minimumFieldOfView
maximumFieldOfView: parent.maximumFieldOfView
minimumTilt: parent.minimumTilt
maximumTilt: parent.maximumTilt
minimumZoomLevel: parent.minimumZoomLevel
maximumZoomLevel: parent.maximumZoomLevel
zoomLevel: parent.zoomLevel
tilt: parent.tilt;
bearing: parent.bearing
fieldOfView: parent.fieldOfView
z: parent.z + 1;
Component.onCompleted: {
//
updateActiveMapType(this,"Tianditu Street Road");
}
}
// Qt6
PinchHandler {
id: pinch
target: null
onActiveChanged: if (active) {
map.startCentroid = map.toCoordinate(pinch.centroid.position, false)
}
onScaleChanged: (delta) => {
map.zoomLevel += Math.log2(delta)
map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
}
onRotationChanged: (delta) => {
map.bearing -= delta
map.alignCoordinateToPoint(map.startCentroid, pinch.centroid.position)
}
grabPermissions: PointerHandler.TakeOverForbidden
}
WheelHandler {
id: wheel
// workaround for QTBUG-87646 / QTBUG-112394 / QTBUG-112432:
// Magic Mouse pretends to be a trackpad but doesn't work with PinchHandler
// and we don't yet distinguish mice and trackpads on Wayland either
acceptedDevices: Qt.platform.pluginName === "cocoa" || Qt.platform.pluginName === "wayland"
? PointerDevice.Mouse | PointerDevice.TouchPad
: PointerDevice.Mouse
rotationScale: 1/15
property: "zoomLevel"
}
//使Rectangle DragHandler
// 使 MouseArea DragHandler
DragHandler {
id: drag
target: null
onTranslationChanged: (delta) => map.pan(-delta.x, -delta.y)
}
Shortcut {
enabled: map.zoomLevel < map.maximumZoomLevel
sequence: StandardKey.ZoomIn
onActivated: map.zoomLevel = Math.round(map.zoomLevel + 1)
}
Shortcut {
enabled: map.zoomLevel > map.minimumZoomLevel
sequence: StandardKey.ZoomOut
onActivated: map.zoomLevel = Math.round(map.zoomLevel - 1)
}
/*
MouseArea {
id: mapMouseArea
anchors.fill: parent
hoverEnabled: true
z: overlayMap.visible ? overlayMap.z + 1 : map.z + 1
property real startMouseX: 0
property real startMouseY: 0
property real lastMouseX: 0
property real lastMouseY: 0
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
let point = Qt.point(mouse.x, mouse.y)
// mapPositionClicked(point)
// mapCoordinateClicked(map.toCoordinate(point))
}
}
onPressed: mouse => {
lastMouseX = Math.round(mouse.x)
lastMouseY = Math.round(mouse.y)
startMouseX = lastMouseX
startMouseY = lastMouseY
}
onDoubleClicked: mouse => {
// mapPositionDoubleClicked(Qt.point(mouse.x,
// mouse.y))
}
onPositionChanged: mouse => {
let point = Qt.point(mouse.x, mouse.y)
mapPosition = point
mapCoordinate = map.toCoordinate(point)
if (pressed) {
var newMouseX = Math.round(mouse.x)
var newMouseY = Math.round(mouse.y)
map.pan(lastMouseX - newMouseX,
lastMouseY - newMouseY)
lastMouseX = newMouseX
lastMouseY = newMouseY
}
}
}
*/
} }

@ -0,0 +1,88 @@
/**************************************************************************
* tibingmapprovider.h
* =======================================================================
*
* 2021-8-31
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include "timapprovider.h"
class TiBingMapProvider : public TiMapProvider
{
Q_OBJECT
public:
TiBingMapProvider(const QString& imageFormat, const quint32 averageSize,
const QGeoMapType::MapStyle mapType, QObject* parent = nullptr);
~TiBingMapProvider() = default;
protected:
const QString _versionBingMaps = QStringLiteral("563");
};
static const quint32 AVERAGE_BING_STREET_MAP = 1297;
static const quint32 AVERAGE_BING_SAT_MAP = 19597;
// -----------------------------------------------------------
// Bing Road Map
class TiBingRoadMapProvider : public TiBingMapProvider
{
Q_OBJECT
public:
TiBingRoadMapProvider(QObject* parent = nullptr) :
TiBingMapProvider(QStringLiteral("png"), AVERAGE_BING_STREET_MAP, QGeoMapType::StreetMap, parent)
{
}
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
// -----------------------------------------------------------
// Bing Satellite Map
class TiBingSatelliteMapProvider : public TiBingMapProvider
{
Q_OBJECT
public:
TiBingSatelliteMapProvider(QObject* parent = nullptr) :
TiBingMapProvider(QStringLiteral("jpg"), AVERAGE_BING_SAT_MAP, QGeoMapType::SatelliteMapDay,
parent)
{
}
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
// -----------------------------------------------------------
// Bing Hybrid Map
class TiBingHybridMapProvider : public TiBingMapProvider
{
Q_OBJECT
public:
TiBingHybridMapProvider(QObject* parent = nullptr) :
TiBingMapProvider(QStringLiteral("jpg"), AVERAGE_BING_SAT_MAP, QGeoMapType::HybridMap, parent)
{
}
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};

@ -0,0 +1,71 @@
/**************************************************************************
* tiesrimapprovider.h
* =======================================================================
*
* 2021-8-31
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include "timapprovider.h"
class TiEsriMapProvider : public TiMapProvider
{
Q_OBJECT
public:
TiEsriMapProvider(const quint32 averageSize, const QGeoMapType::MapStyle mapType,
QObject* parent = nullptr);
QNetworkRequest getTileURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
class TiEsriWorldStreetMapProvider : public TiEsriMapProvider
{
Q_OBJECT
public:
TiEsriWorldStreetMapProvider(QObject* parent = nullptr) :
TiEsriMapProvider(AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent)
{
}
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
class TiEsriWorldSatelliteMapProvider : public TiEsriMapProvider
{
Q_OBJECT
public:
TiEsriWorldSatelliteMapProvider(QObject* parent = nullptr) :
TiEsriMapProvider(AVERAGE_TILE_SIZE, QGeoMapType::SatelliteMapDay, parent)
{
}
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
class TiEsriTerrainMapProvider : public TiEsriMapProvider
{
Q_OBJECT
public:
TiEsriTerrainMapProvider(QObject* parent = nullptr) :
TiEsriMapProvider(AVERAGE_TILE_SIZE, QGeoMapType::TerrainMap, parent)
{
}
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};

@ -0,0 +1,36 @@
/**************************************************************************
* tigeotilefetcher.h
* =======================================================================
*
* 2021-5-12
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <private/qgeotilefetcher_p.h>
#include <QNetworkAccessManager>
class TiGeoTileFetcher : public QGeoTileFetcher
{
public:
TiGeoTileFetcher(const QVariantMap& parameters, QGeoMappingManagerEngine* parent);
// QGeoTileFetcher interface
private:
QGeoTiledMapReply* getTileImage(const QGeoTileSpec& spec) override;
private:
QNetworkAccessManager* m_networkManager = nullptr;
};

@ -0,0 +1,150 @@
/**************************************************************************
* tigooglemapprovider.h
* =======================================================================
*
* 2021-8-30
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include "timapprovider.h"
#include <QMutex>
#include <QNetworkReply>
class TiGoogleMapProvider : public TiMapProvider
{
Q_OBJECT
public:
TiGoogleMapProvider(const QString& format, const quint32 averageSize,
const QGeoMapType::MapStyle mapType = QGeoMapType::CustomMap,
QObject* parent = nullptr);
// Google Specific private slots
private slots:
void _networkReplyError(QNetworkReply::NetworkError error);
void _googleVersionCompleted();
void _replyDestroyed();
protected:
// Google Specific private methods
void getSecGoogleWords(const int x, const int y, QString& sec1, QString& sec2) const;
void tryCorrectGoogleVersions(QNetworkAccessManager* networkManager);
// Google Specific attributes
bool _googleVersionRetrieved;
QNetworkReply* _googleReply;
QMutex _googleVersionMutex;
QString _versionGoogleMap;
QString _versionGoogleSatellite;
QString _versionGoogleLabels;
QString _versionGoogleTerrain;
QString _versionGoogleHybrid;
QString _secGoogleWord;
};
static const quint32 AVERAGE_GOOGLE_STREET_MAP = 4913;
static const quint32 AVERAGE_GOOGLE_SAT_MAP = 56887;
static const quint32 AVERAGE_GOOGLE_TERRAIN_MAP = 19391;
// -----------------------------------------------------------
// Google Street Map
class TiGoogleStreetMapProvider : public TiGoogleMapProvider
{
Q_OBJECT
public:
TiGoogleStreetMapProvider(QObject* parent = nullptr) :
TiGoogleMapProvider(QStringLiteral("png"), AVERAGE_GOOGLE_STREET_MAP,
QGeoMapType::StreetMap, parent)
{
}
protected:
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
// -----------------------------------------------------------
// Google Street Map
class TiGoogleSatelliteMapProvider : public TiGoogleMapProvider
{
Q_OBJECT
public:
TiGoogleSatelliteMapProvider(QObject* parent = nullptr) :
TiGoogleMapProvider(QStringLiteral("jpg"), AVERAGE_GOOGLE_SAT_MAP,
QGeoMapType::SatelliteMapDay, parent)
{
}
protected:
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
// -----------------------------------------------------------
// Google Labels Map
class TiGoogleLabelsMapProvider : public TiGoogleMapProvider
{
Q_OBJECT
public:
TiGoogleLabelsMapProvider(QObject* parent = nullptr) :
TiGoogleMapProvider(QStringLiteral("png"), AVERAGE_TILE_SIZE, QGeoMapType::CustomMap, parent)
{
}
protected:
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
// -----------------------------------------------------------
// Google Terrain Map
class TiGoogleTerrainMapProvider : public TiGoogleMapProvider
{
Q_OBJECT
public:
TiGoogleTerrainMapProvider(QObject* parent = nullptr) :
TiGoogleMapProvider(QStringLiteral("png"), AVERAGE_GOOGLE_TERRAIN_MAP,
QGeoMapType::TerrainMap, parent)
{
}
protected:
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
// -----------------------------------------------------------
// Google Hybrid Map
class TiGoogleHybridMapProvider : public TiGoogleMapProvider
{
Q_OBJECT
public:
TiGoogleHybridMapProvider(QObject* parent = nullptr) :
TiGoogleMapProvider(QStringLiteral("png"), AVERAGE_GOOGLE_SAT_MAP, QGeoMapType::HybridMap, parent)
{
}
protected:
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};

@ -0,0 +1,68 @@
/**************************************************************************
* TiMapCacheWorker.h
* =======================================================================
*
* 2021-5-14
* 499131808@qq.com
* Q Q 499131808
*
*
* 使
*使,
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QHostInfo>
#include <QMutex>
#include <QQueue>
#include <QSqlDatabase>
#include <QThread>
#include <QWaitCondition>
class TiMapTask;
/**
* @brief The TiMapCacheWorker class
* /\ 线
*/
class TiMapCacheWorker : public QThread
{
Q_OBJECT
public:
TiMapCacheWorker();
void quit();
bool enqueueTask(TiMapTask* task);
void setDBName(const QString& path);
// QThread interface
protected:
void run() override;
private:
void runTask(TiMapTask* task);
void clear();
bool init();
bool openDB();
bool createDB(QSqlDatabase& db, bool createDefault = true);
void closeDB();
void testInternet(TiMapTask* task);
bool testTask(TiMapTask* task);
void getTile(TiMapTask* task);
void saveTile(TiMapTask* task);
private:
QString m_dbPath;
QMutex m_taskQueueMutex;
QWaitCondition m_waitCond;
QQueue<TiMapTask*> m_taskQueue;
QScopedPointer<QSqlDatabase> m_db;
std::atomic_bool m_valid; // 数据库是否有效,有效指数据库打开并已初始化化
std::atomic_bool m_isInit;
int m_hostLookupID = 0;
};

@ -0,0 +1,84 @@
/**************************************************************************
* timapengine.h
* =======================================================================
*
* 2021-6-16
* 499131808@qq.com
* Q Q 499131808
*
*
* 使
*使,
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QObject>
#include <QTimer>
#include "timapcacheworker.h"
#include "timapenginedata.h"
#include "timapurlengine.h"
/**
* @brief The TiMapEngine class ,
*/
class TiMapEngine : public QObject
{
private:
TiMapEngine(QObject* parent = nullptr);
~TiMapEngine();
public:
static TiMapEngine* instance()
{
static TiMapEngine engine;
return &engine;
}
/**
* @brief getUrlEngine url,null
* @return
*/
TiMapUrlEngine* getUrlEngine() const { return m_mapUrlEngine; }
TiMapFetchTileTask* createFetchTileTask(int mapId, int x, int y, int zoom);
bool internetActive() const { return m_internetState; }
void testInternet();
QString getDBPath() const { return m_dbPath; }
QString getDBName() const { return m_dbName; }
void addTask(TiMapTask* task);
void cacheTile(const QString& type, int x, int y, int zoom, const QByteArray& img,
const QString& format);
void cacheTile(int mapId, int x, int y, int zoom, const QByteArray& img, const QString& format);
bool isCache() const { return m_isCache; }
void setCache(bool cache) { m_isCache = cache; }
static quint32 getTileHash(int mapId, int x, int y, int zoom);
std::atomic_int cacheCount;
private:
void init();
void addTile(const QString& type, int mapid, int x, int y, int zoom, const QByteArray& img,
const QString& format);
private slots:
void onTimeout();
private:
TiMapUrlEngine* m_mapUrlEngine = nullptr;
TiMapCacheWorker m_worker;
std::atomic_bool m_internetState;
QString m_dbPath;
QString m_dbName;
bool m_isCache = true;
QTimer m_timer;
};

@ -0,0 +1,136 @@
/**************************************************************************
* TiMapEngineData.h
* =======================================================================
*
* 2021-6-30
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QObject>
/**
* @brief The TiMapCacheTile class
*/
class TiMapTile : public QObject
{
Q_OBJECT
public:
explicit TiMapTile(uint hash) : m_hash(hash) { }
uint hash() const { return m_hash; }
QByteArray img() const { return m_img; }
int size() const { return m_size; }
QString format() const { return m_format; }
int x() const { return m_x; }
int y() const { return m_y; }
int zoom() const { return m_zoom; }
QString type() const { return m_type; }
int mapId() const { return m_mapId; }
void setImg(const QByteArray& img) { m_img = img; }
void setSize(int size) { m_size = size; }
void setFormat(const QString& format) { m_format = format; }
void setX(int x) { m_x = x; }
void setY(int y) { m_y = y; }
void setZoom(int z) { m_zoom = z; }
void setType(const QString& type) { m_type = type; }
void setMapId(int id) { m_mapId = id; }
private:
uint m_hash = 0; //由 x,y,zoom,type,计算得到的哈希值,具有tile的唯一性
QByteArray m_img; //瓦片具体数据
int m_size = 0; //瓦片数据大小
QString m_format; //瓦片格式
int m_x = 0; //瓦片x
int m_y = 0; //瓦片y
int m_zoom = 0; //瓦片zoom
QString m_type; //地图类型
int m_mapId = 0; //地图类型ID
};
/**
* @brief The TiMapTask class
*/
class TiMapTask : public QObject
{
Q_OBJECT
public:
enum TaskType { taskInit, taskTestInternet, taskCacheTile, taskFetchTile };
Q_ENUM(TaskType)
TiMapTask(TaskType type) : m_type(type) { }
virtual ~TiMapTask() { }
virtual TaskType type() { return m_type; }
void setError(QString errorString = QString()) { emit error(type(), errorString); }
signals:
void error(TiMapTask::TaskType type, QString errorString);
private:
TaskType m_type;
};
/**
* @brief The TiMapTestInternetTask class
*
*/
class TiMapTestInternetTask : public TiMapTask
{
Q_OBJECT
public:
TiMapTestInternetTask() : TiMapTask(TiMapTask::taskTestInternet) { }
};
/**
* @brief The TiMapFetchTileTask class tile()
*/
class TiMapFetchTileTask : public TiMapTask
{
Q_OBJECT
public:
TiMapFetchTileTask(uint hash) : TiMapTask(TiMapTask::taskFetchTile), m_hash(hash) { }
//设置已经获取到的tile
void setTileFetched(TiMapTile* tile) { emit tileFetched(tile); }
uint hash() const { return m_hash; }
signals:
void tileFetched(TiMapTile* tile);
private:
uint m_hash;
};
/**
* @brief The TiMapSaveTileTask class tile
*/
class TiMapSaveTileTask : public TiMapTask
{
Q_OBJECT
public:
TiMapSaveTileTask(TiMapTile* tile) : TiMapTask(TiMapTask::taskCacheTile), m_tile(tile) { }
~TiMapSaveTileTask()
{
if (m_tile) {
delete m_tile;
m_tile = nullptr;
}
}
TiMapTile* tile() const { return m_tile; }
private:
TiMapTile* m_tile = nullptr;
};

@ -0,0 +1,36 @@
/**************************************************************************
* timapjsonengine.h
* =======================================================================
*
* 2021-6-29
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QJsonObject>
#include <QObject>
/**
* @brief The TiMapJsonEngine class
*/
class TiMapJsonEngine : public QObject
{
Q_OBJECT
public:
TiMapJsonEngine(const QString& path, QObject* parent = nullptr);
QString getToken(const QString& provide);
private:
QJsonObject m_jsonObj;
};

@ -0,0 +1,62 @@
/**************************************************************************
* timapprovider.h
* =======================================================================
*
* 2021-6-16
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QObject>
#include <private/qgeomaptype_p.h>
class TiMapProvider : public QObject
{
Q_OBJECT
public:
TiMapProvider(const QString& imageFormat, const quint32 averageSize,
const QGeoMapType::MapStyle mapType = QGeoMapType::CustomMap,
QObject* parent = nullptr);
/**
* @brief getTileURL
* @return ,使
*/
virtual QNetworkRequest getTileURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager);
virtual void setToken(const QString& token) { Q_UNUSED(token) }
virtual bool isElevationProvider() const { return false; }
virtual bool isBingProvider() const { return false; }
QGeoMapType::MapStyle getMapStyle() const { return m_mapType; }
QString getImageFormat(const QByteArray& image) const;
enum { AVERAGE_TILE_SIZE = 13652 };
protected:
virtual QString getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager)
= 0;
QString tileXYToQuadKey(const int tileX, const int tileY, const int levelOfDetail) const;
int getServerNum(const int x, const int y, const int max) const;
protected:
QGeoMapType::MapStyle m_mapType;
QString m_referrer;
QString m_imageFormat;
quint32 m_averageSize;
QByteArray m_userAgent;
QString m_language;
};

@ -0,0 +1,54 @@
/**************************************************************************
* timapurlengine.h
* =======================================================================
*
* 2021-6-17
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QHash>
#include <QNetworkAccessManager>
#include <QObject>
class TiMapProvider;
/**
* @brief The TiMapUrlEngine class
* hash map
*/
class TiMapUrlEngine : public QObject
{
Q_OBJECT
public:
TiMapUrlEngine(QObject* parent = nullptr);
typedef QPair<QString, TiMapProvider*> ProviderPair;
QMap<QString, QString> getProviderNameList() const;
QString getTypeFromId(const int id) const;
int getIdFromType(const QString& type) const;
TiMapProvider* getMapProviderFromId(int id) const;
TiMapProvider* getMapProviderFromType(const QString& type) const;
QNetworkRequest getTileUrl(int id, int x, int y, int zoom,
QNetworkAccessManager* networkManager) const;
QNetworkRequest getTileUrl(const QString& type, int x, int y, int zoom,
QNetworkAccessManager* networkManager) const;
QString getImageFormat(QString type, const QByteArray& image);
QString getImageFormat(int id, const QByteArray& image);
bool isElevation(int mapId);
private:
QList<ProviderPair> m_providerList;
QMap<QString, QString> m_providerNameList;
};

@ -0,0 +1,37 @@
/**************************************************************************
* tiqgeocodereply.h
* =======================================================================
*
* 2021-5-17
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QGeoCodeReply>
#include <QNetworkReply>
class TiQGeoCodeReply : public QGeoCodeReply
{
Q_OBJECT
public:
explicit TiQGeoCodeReply(QNetworkReply* reply, QObject* parent = nullptr);
~TiQGeoCodeReply();
private slots:
void networkReplyFinish();
void networkReplyError(QNetworkReply::NetworkError error);
private:
QNetworkReply* m_reply;
};

@ -0,0 +1,50 @@
/**************************************************************************
* tiqgeofiletilecache.h
* =======================================================================
*
* 2021-5-13
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <private/qgeofiletilecache_p.h>
#include <QSqlDatabase>
class TiQGeoFileTileCache : public QGeoFileTileCache
{
public:
TiQGeoFileTileCache(const QString& directory = QString(), QObject* parent = nullptr);
~TiQGeoFileTileCache();
QSharedPointer<QGeoTileTexture> get(const QGeoTileSpec& spec) override;
void insert(const QGeoTileSpec& spec, const QByteArray& bytes, const QString& format,
QAbstractGeoTileCache::CacheAreas areas = QAbstractGeoTileCache::AllCaches) override;
private:
void addToSqlite(const QGeoTileSpec& spec, const QString& format, const QByteArray& bytes);
QSharedPointer<QGeoTileTexture> getFromSqlite(const QGeoTileSpec& spec);
//由于qtlocation提供的qhash计算出现错误的机率较大,因此我们自已计算hash
static quint64 getTileHash(int type, int x, int y, int z);
bool openSqlite(const QString& connectId);
private:
QSqlDatabase* m_db = nullptr;
bool m_valid = false;
QString m_dbName = "TiMapCache.db";
};

@ -0,0 +1,39 @@
/**************************************************************************
* tiqeoserviceproviderfactory.h
* =======================================================================
*
* 2021-4-27
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QGeoServiceProviderFactory>
#include <QObject>
#include <QtPlugin>
QT_BEGIN_NAMESPACE
class TiQGeoServiceProviderFactory : public QObject, public QGeoServiceProviderFactory
{
Q_OBJECT
Q_INTERFACES(QGeoServiceProviderFactory)
Q_PLUGIN_METADATA(IID "org.qt-project.qt.geoservice.serviceproviderfactory/6.0" FILE
"timap_plugin.json")
public:
TiQGeoServiceProviderFactory();
// QGeoServiceProviderFactory interface
public:
QGeoMappingManagerEngine* createMappingManagerEngine(const QVariantMap& parameters,
QGeoServiceProvider::Error* error,
QString* errorString) const override;
};
QT_END_NAMESPACE

@ -0,0 +1,33 @@
/**************************************************************************
* tiqgeotiledmappingmanagerengine.h
* =======================================================================
*
* 2021-4-27
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <QtLocation/QGeoServiceProvider>
#include <QtLocation/private/qgeotiledmappingmanagerengine_p.h>
class TiQGeoTiledMappingManagerEngine : public QGeoTiledMappingManagerEngine
{
public:
TiQGeoTiledMappingManagerEngine(const QVariantMap& parameters,
QGeoServiceProvider::Error* error, QString* errorString);
~TiQGeoTiledMappingManagerEngine();
QGeoMap* createMap() override;
private:
void setCache(const QVariant& parameters);
};

@ -0,0 +1,55 @@
/**************************************************************************
* tiqgeotiledmapreply.h
* =======================================================================
*
* 2021-5-12
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include <private/qgeotiledmapreply_p.h>
#include <QNetworkReply>
#include <QTimer>
#include "timapengine.h"
class TiQGeoTiledMapReply : public QGeoTiledMapReply
{
Q_OBJECT
public:
TiQGeoTiledMapReply(QNetworkAccessManager* networkManger, const QNetworkRequest& reply,
const QGeoTileSpec& spec, QObject* parent = nullptr);
~TiQGeoTiledMapReply();
void abort() override;
private slots:
void networkReplyFinished();
void networkReplyError(QNetworkReply::NetworkError error);
void onCacheReply(TiMapTile* tile);
void onCacheError(TiMapTask::TaskType type, QString errorString);
void onTimeout();
private:
void closeReply();
quint32 hash();
private:
QNetworkReply* m_reply;
QNetworkRequest m_request;
QNetworkAccessManager* m_networkManager;
QByteArray m_noTitle;
QTimer m_timer;
};

@ -0,0 +1,90 @@
/**************************************************************************
* titianditumapprovider.h
* =======================================================================
*
* 2021-6-16
* 499131808@qq.com
* Q Q 499131808
*
*
*
* ======================================================================
*
*
*
* ======================================================================
*
***************************************************************************/
#pragma once
#include "timapprovider.h"
class TiTiandituMapProvider : public TiMapProvider
{
public:
TiTiandituMapProvider(const QString& format, const quint32 averageSize,
const QGeoMapType::MapStyle mapType = QGeoMapType::CustomMap,
QObject* parent = nullptr);
// TiMapProvider interface
public:
void setToken(const QString& token) override;
protected:
QString m_token;
};
/**
* @brief The TiTiandituImgMapProvider class
*/
class TiTiandituImgMapProvider : public TiTiandituMapProvider
{
public:
TiTiandituImgMapProvider(QObject* parent = nullptr);
~TiTiandituImgMapProvider();
protected:
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
/**
* @brief The TiTiandituCiaMapProvider class
*/
class TiTiandituCiaMapProvider : public TiTiandituMapProvider
{
public:
TiTiandituCiaMapProvider(QObject* parent = nullptr);
~TiTiandituCiaMapProvider();
protected:
QString getURL(const int x, const int y, const int zoom,
QNetworkAccessManager* networkManager) override;
};
///
/// \brief The TiTiandituVecMapProvider class 天地图失量底图
///
class TiTiandituVecMapProvider : public TiTiandituMapProvider
{
public:
TiTiandituVecMapProvider(QObject* parent = nullptr);
~TiTiandituVecMapProvider();
protected:
QString getURL(const int x,
const int y,
const int zoom,
QNetworkAccessManager* networkManager) override;
};
class TiTiandituCvaMapProvider : public TiTiandituMapProvider
{
public:
TiTiandituCvaMapProvider(QObject* parent = nullptr);
~TiTiandituCvaMapProvider();
protected:
QString getURL(const int x,
const int y,
const int zoom,
QNetworkAccessManager* networkManager) override;
};

@ -176,19 +176,31 @@ void ImsiTableModel::setDataMap(const QHash<QString, ImsiData> &dataMap)
endResetModel(); endResetModel();
} }
void ImsiTableModel::clearData()
{
beginResetModel();
this->m_dataMap.clear();
this->m_imsiList.clear();
this->m_imsiIndex.clear();
endResetModel(); // endResetModel结束会自动发送resetModel信号但不等价于clear还需要另外判断不如直接写一个单独的信号
emit dataCleared();
}
void ImsiTableModel::updateData(const ImsiData &data) void ImsiTableModel::updateData(const ImsiData &data)
{ {
QString imsi = data.imsi; QString imsi = data.imsi;
if (m_dataMap.contains(imsi)) { if (m_dataMap.contains(imsi)) {
// 更新现有数据 // 更新现有数据
m_dataMap[imsi] = data;
int row = m_imsiIndex.value(imsi); int row = m_imsiIndex.value(imsi);
emit dataChanged(index(row, 0), index(row, columnCount() - 1)); m_dataMap[imsi] = data;
emit dataChanged(index(row, 0), index(row, columnCount() - 1), m_roleNames.keys());
} else { } else {
// 插入新数据 // 插入新数据
beginInsertRows(QModelIndex(), m_imsiList.size(), m_imsiList.size()); beginInsertRows(QModelIndex(), m_imsiList.size(), m_imsiList.size());
m_imsiList.append(imsi); m_imsiList.append(imsi);
m_dataMap.insert(imsi, data); m_dataMap.insert(imsi, data);
m_imsiIndex.insert(imsi, m_imsiList.size()-1);
endInsertRows(); endInsertRows();
} }
} }
@ -256,12 +268,17 @@ void RescueLoad::startCommunication()
void RescueLoad::sendMessage(const QString &message) void RescueLoad::sendMessage(const QString &message)
{ {
QByteArray datagram = message.toUtf8(); QByteArray datagram = message.toUtf8();
udpSocket->writeDatagram(datagram, QHostAddress(remoteIp), remotePort); sendMessage(datagram, QHostAddress(remoteIp), remotePort);
} }
void RescueLoad::sendMessage(const QByteArray &datagram) void RescueLoad::sendMessage(const QByteArray &datagram)
{ {
udpSocket->writeDatagram(datagram, QHostAddress(remoteIp), remotePort); sendMessage(datagram, QHostAddress(remoteIp), remotePort);
}
void RescueLoad::sendMessage(const QByteArray &datagram, const QHostAddress& targetAddress, const int targetPort)
{
udpSocket->writeDatagram(datagram, targetAddress, targetPort);
} }
void RescueLoad::readData() void RescueLoad::readData()
@ -274,15 +291,15 @@ void RescueLoad::readData()
udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
// qDebug() << "Received response from" << sender.toString() << ":" << senderPort; // qDebug() << "Received response from" << sender.toString() << ":" << senderPort;
// qDebug() << "Data:" << datagram; // qDebug() << "Data:" << datagram;
handleMessage(datagram); handleMessage(datagram, sender, senderPort);
} }
} }
void RescueLoad::handleMessage(const QByteArray &datagram) { void RescueLoad::handleMessage(const QByteArray &datagram, const QHostAddress& sender, const int senderPort) {
QJsonParseError json_error; QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(datagram, &json_error)); QJsonDocument jsonDoc(QJsonDocument::fromJson(datagram, &json_error));
if(json_error.error != QJsonParseError::NoError || !jsonDoc.isObject()){ if(json_error.error != QJsonParseError::NoError || !jsonDoc.isObject()){
qDebug() << "json error!"; qDebug() << "[搜救] json error!";
return; return;
} }
@ -299,10 +316,10 @@ void RescueLoad::handleMessage(const QByteArray &datagram) {
switch (type) { switch (type) {
case 1: // 4G心跳包 case 1: // 4G心跳包
// todo // todo
sendMessage(QString("{\"cmd\": \"heartbeat\"}")); // 定时回心跳,或者单独开定时器 sendMessage(QString("{\"cmd\": \"heartbeat\"}").toUtf8(), sender, senderPort); // 定时回心跳,或者单独开定时器
break; break;
case 2: // 5G心跳包 case 2: // 5G心跳包
sendMessage(QString("{\"cmd\": \"heartbeat\"}")); sendMessage(QString("{\"cmd\": \"heartbeat\"}").toUtf8(), sender, senderPort);
break; break;
case 3:{ // IMSI数据 case 3:{ // IMSI数据
QJsonArray array = baseObj.value("data").toArray(); QJsonArray array = baseObj.value("data").toArray();

@ -62,8 +62,8 @@ public:
int columnCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
Q_INVOKABLE QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override; Q_INVOKABLE QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override;
void setDataMap(const QHash<QString, ImsiData>& dataMap ); void setDataMap(const QHash<QString, ImsiData>& dataMap );
void clearData();
void updateData(const ImsiData &data); void updateData(const ImsiData &data);
QHash<QString, ImsiData>& getDataMap(){ QHash<QString, ImsiData>& getDataMap(){
return m_dataMap; return m_dataMap;
@ -73,6 +73,7 @@ public:
void saveDataListToCsv(const QString &filePath, const QString &delimiter = ","); void saveDataListToCsv(const QString &filePath, const QString &delimiter = ",");
signals: signals:
void detailUpdated(QString, double, double); void detailUpdated(QString, double, double);
void dataCleared();
protected: protected:
// return the roles mapping to be used by QML // return the roles mapping to be used by QML
virtual QHash<int, QByteArray> roleNames() const override; virtual QHash<int, QByteArray> roleNames() const override;
@ -100,6 +101,7 @@ public:
void startCommunication(); // 在工作线程中运行 void startCommunication(); // 在工作线程中运行
void sendMessage(const QString &message); void sendMessage(const QString &message);
void sendMessage(const QByteArray &datagram); void sendMessage(const QByteArray &datagram);
void sendMessage(const QByteArray &datagram, const QHostAddress &targetAddress, const int port);
void syncTime(); void syncTime();
void sendNameList(const QString action, const QString type, const QList<QString> &wnamelist, const QList<QString> &bnamelist); void sendNameList(const QString action, const QString type, const QList<QString> &wnamelist, const QList<QString> &bnamelist);
@ -111,10 +113,9 @@ private slots:
public : public :
QString remoteIp; QString remoteIp;
int remotePort; int remotePort;
private: private:
QUdpSocket* udpSocket; QUdpSocket* udpSocket;
void handleMessage(const QByteArray &datagram); void handleMessage(const QByteArray &datagram, const QHostAddress& targetAddress, const int targetPort);
}; };

@ -14,7 +14,7 @@
#include <QQmlComponent> #include <QQmlComponent>
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox> #include <QMessageBox>
#include "tiqgeoserviceproviderfactory.h"
RescueLoadWidget::RescueLoadWidget(QWidget *parent) RescueLoadWidget::RescueLoadWidget(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::RescueLoadWidget) , ui(new Ui::RescueLoadWidget)
@ -44,16 +44,18 @@ RescueLoadWidget::~RescueLoadWidget()
delete ui; delete ui;
} }
// 使用QLocation加载地图模块 (fixme: 能显示地图但是无法向qml传递数据 // 使用QLocation加载地图模块 (这里可以考虑换成内嵌网页地图
void RescueLoadWidget::openQLocationMap() { void RescueLoadWidget::openQLocationMap() {
Q_IMPORT_PLUGIN(TiQGeoServiceProviderFactory)
QQuickView *qmlView = new QQuickView(); QQuickView *qmlView = new QQuickView();
// 列表和地图共享一个datamodel减少重复的数据处理
qmlView->rootContext()->setContextProperty("imsiDataModel", imsiDataModel); // 注意先绑定属性再设置qml qmlView->rootContext()->setContextProperty("imsiDataModel", imsiDataModel); // 注意先绑定属性再设置qml
qmlView->rootContext()->setContextProperty("imsiSelectModel", ui->deviceview->selectionModel()); // 注意先绑定属性再设置qml qmlView->rootContext()->setContextProperty("imsiSelectModel", ui->deviceview->selectionModel()); // 注意先绑定属性再设置qml
qmlView->setSource(QUrl("qrc:/places_map.qml")); qmlView->setSource(QUrl("qrc:/places_map.qml"));
QWidget *container = QWidget::createWindowContainer(qmlView, this); QWidget *container = QWidget::createWindowContainer(qmlView, this);
ui->mapGroup->setLayout(new QVBoxLayout); ui->mapGroup->setLayout(new QVBoxLayout);
ui->mapGroup->layout()->addWidget(container); ui->mapGroup->layout()->addWidget(container);
qDebug()<<"搜救地图开启"<<imsiDataModel->getDataMap().keys().size(); qDebug()<<"[搜救] 搜救地图开启"<<imsiDataModel->getDataMap().keys().size();
// 接收QML的信号 // 接收QML的信号
QObject* object = (QObject* )qmlView->rootObject(); QObject* object = (QObject* )qmlView->rootObject();
// connect(object, SIGNAL(locationClicked(QString)), this, SLOT(updateDetailTable(QString))); // connect(object, SIGNAL(locationClicked(QString)), this, SLOT(updateDetailTable(QString)));
@ -61,7 +63,6 @@ void RescueLoadWidget::openQLocationMap() {
} }
void RescueLoadWidget::tableIndexClicked(int row){ void RescueLoadWidget::tableIndexClicked(int row){
// qDebug()<<row;
emit ui->deviceview->clicked(imsiDataModel->index(row)); emit ui->deviceview->clicked(imsiDataModel->index(row));
} }
@ -304,6 +305,7 @@ void RescueLoadWidget::updateWBnamelist(QString listType, QString sendType, QLis
{ {
QStandardItemModel *namelistModel = listType=="W"? wnamelistModel: bnamelistModel; QStandardItemModel *namelistModel = listType=="W"? wnamelistModel: bnamelistModel;
QSet<QString> &namelistToShow = listType=="W"? wnamelist : bnamelist; QSet<QString> &namelistToShow = listType=="W"? wnamelist : bnamelist;
QTableView *namelistView= listType=="W"? ui->wnameview : ui->bnameview;
// 更新黑/白名单列表 // 更新黑/白名单列表
if (sendType == "ADD") { // 新增 if (sendType == "ADD") { // 新增
@ -326,6 +328,8 @@ void RescueLoadWidget::updateWBnamelist(QString listType, QString sendType, QLis
namelistModel->setColumnCount(2); namelistModel->setColumnCount(2);
namelistModel->setRowCount(namelistToShow.size()); namelistModel->setRowCount(namelistToShow.size());
namelistModel->setHorizontalHeaderLabels(QStringList()<<"IMSI"<<"运营商"); namelistModel->setHorizontalHeaderLabels(QStringList()<<"IMSI"<<"运营商");
namelistView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);//对第2列单独设置固定宽度
namelistView->setColumnWidth(1, 100);//设置固定宽度
int i = 0; int i = 0;
for (const QString &imsi : namelistToShow) { for (const QString &imsi : namelistToShow) {
QStandardItem *item1 =standardItem->clone(); QStandardItem *item1 =standardItem->clone();
@ -336,12 +340,12 @@ void RescueLoadWidget::updateWBnamelist(QString listType, QString sendType, QLis
namelistModel->setItem(i, 1, item2); namelistModel->setItem(i, 1, item2);
i ++ ; i ++ ;
} }
qDebug() << "名单数据更新end"<< namelistModel->rowCount(); // qDebug() << "[搜救] 名单数据更新end"<< namelistModel->rowCount();
} }
void RescueLoadWidget::on_ipportBtn_clicked() slots void RescueLoadWidget::on_ipportBtn_clicked()
{ {
QString newIp = ui->ipEdit->text().trimmed(); QString newIp = ui->ipEdit->text().trimmed();
int newPort = ui->portEdit->text().trimmed().toInt(); int newPort = ui->portEdit->text().trimmed().toInt();
@ -350,14 +354,18 @@ void RescueLoadWidget::on_ipportBtn_clicked()
} }
void RescueLoadWidget::on_saveFileButton_clicked() slots void RescueLoadWidget::on_saveFileButton_clicked()
{ {
QString timeStr = QDateTime::currentDateTime().toString("yyyy-MM-ddThh-mm-ss"); QString timeStr = QDateTime::currentDateTime().toString("yyyy-MM-ddThh-mm-ss");
QString defaultPath = QString("%1/搜救信息%2.csv").arg(imsiDataModel->getSaveDir(), timeStr); QString defaultPath = QString("%1/搜救信息%2.csv").arg(imsiDataModel->getSaveDir(), timeStr);
QString filePath = QFileDialog::getSaveFileName(this, tr("保存文件"), defaultPath, tr("CSV 文件 (*.csv)")); QString filePath = QFileDialog::getSaveFileName(this, tr("保存文件"), defaultPath, tr("CSV 文件 (*.csv)"));
qDebug()<< filePath; qDebug()<< "[搜救] 文件保存"<< filePath;
if (!filePath.isEmpty()) { if (!filePath.isEmpty()) {
imsiDataModel->saveDataListToCsv(filePath); imsiDataModel->saveDataListToCsv(filePath);
} }
} }
slots void RescueLoadWidget::on_clearBtn_clicked()
{
imsiDataModel->clearData();
}

@ -53,6 +53,8 @@ private slots:
void on_ipportBtn_clicked(); void on_ipportBtn_clicked();
void on_saveFileButton_clicked(); void on_saveFileButton_clicked();
void on_clearBtn_clicked();
private: private:
void setDeviceTable(QTableWidget* tableWidget); void setDeviceTable(QTableWidget* tableWidget);
void addNewData(); void addNewData();

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1106</width> <width>1106</width>
<height>689</height> <height>684</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -33,249 +33,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="2" rowspan="2">
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>330</width>
<height>250</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>300</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="allDevicesTab">
<attribute name="title">
<string>设备检索列表</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="saveFileButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>保存当前检索的设备列表到文件</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="deviceview">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ctrl + C 可复制单元格内容&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">color:black;
background-color:transparent;
</string>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="blackListTab">
<attribute name="title">
<string>黑名单</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QTableView" name="bnameview">
<property name="showGrid">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="whiteListTab">
<attribute name="title">
<string>白名单</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QTableView" name="wnameview">
<property name="showGrid">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>275</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>300</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="title">
<string>设备详情</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="topMargin">
<number>10</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QTableWidget" name="deviceDetail">
<property name="minimumSize">
<size>
<width>0</width>
<height>240</height>
</size>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ctrl + C 可复制单元格内容&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="columnCount">
<number>1</number>
</property>
<attribute name="horizontalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>40</number>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>160</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderMinimumSectionSize">
<number>25</number>
</attribute>
<attribute name="verticalHeaderDefaultSectionSize">
<number>30</number>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>false</bool>
</attribute>
<row>
<property name="text">
<string>设备IMSI</string>
</property>
</row>
<row>
<property name="text">
<string>运营商</string>
</property>
</row>
<row>
<property name="text">
<string>经度</string>
</property>
</row>
<row>
<property name="text">
<string>纬度</string>
</property>
</row>
<row>
<property name="text">
<string>海拔高度</string>
</property>
</row>
<row>
<property name="text">
<string>频点</string>
</property>
</row>
<row>
<property name="text">
<string>强度</string>
</property>
</row>
<row>
<property name="text">
<string>时间</string>
</property>
</row>
<column/>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="minimumSize">
@ -553,6 +310,256 @@ background-color:transparent;
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="0" column="2" rowspan="2">
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>330</width>
<height>250</height>
</size>
</property>
<layout class="QGridLayout" name="gridLayout_7">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>300</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="allDevicesTab">
<attribute name="title">
<string>设备检索列表</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="1">
<widget class="QPushButton" name="saveFileButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>保存当前检索的设备列表到文件</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="clearBtn">
<property name="text">
<string>清空列表</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTableView" name="deviceview">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#000000;&quot;&gt;Ctrl + C 可复制单元格内容&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">color:black;
background-color:transparent;
</string>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="blackListTab">
<attribute name="title">
<string>黑名单</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QTableView" name="bnameview">
<property name="showGrid">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="whiteListTab">
<attribute name="title">
<string>白名单</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QTableView" name="wnameview">
<property name="showGrid">
<bool>false</bool>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>320</width>
<height>275</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>300</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="title">
<string>设备详情</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="topMargin">
<number>10</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QTableWidget" name="deviceDetail">
<property name="minimumSize">
<size>
<width>0</width>
<height>240</height>
</size>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ctrl + C 可复制单元格内容&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="columnCount">
<number>1</number>
</property>
<attribute name="horizontalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>40</number>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>160</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderMinimumSectionSize">
<number>25</number>
</attribute>
<attribute name="verticalHeaderDefaultSectionSize">
<number>30</number>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>false</bool>
</attribute>
<row>
<property name="text">
<string>设备IMSI</string>
</property>
</row>
<row>
<property name="text">
<string>运营商</string>
</property>
</row>
<row>
<property name="text">
<string>经度</string>
</property>
</row>
<row>
<property name="text">
<string>纬度</string>
</property>
</row>
<row>
<property name="text">
<string>海拔高度</string>
</property>
</row>
<row>
<property name="text">
<string>频点</string>
</property>
</row>
<row>
<property name="text">
<string>强度</string>
</property>
</row>
<row>
<property name="text">
<string>时间</string>
</property>
</row>
<column/>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QGroupBox" name="groupBox_3"> <widget class="QGroupBox" name="groupBox_3">
<property name="enabled"> <property name="enabled">
@ -577,6 +584,9 @@ background-color:transparent;
<property name="topMargin"> <property name="topMargin">
<number>12</number> <number>12</number>
</property> </property>
<property name="bottomMargin">
<number>9</number>
</property>
<item row="0" column="1"> <item row="0" column="1">
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
@ -703,8 +713,11 @@ background-color:transparent;
<pointsize>12</pointsize> <pointsize>12</pointsize>
</font> </font>
</property> </property>
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;点击输入IMSI或选择右侧列表项导入&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#000000;&quot;&gt;点击输入IMSI或选择右侧列表项导入&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">color:white; <string notr="true">color:white;

Loading…
Cancel
Save