日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qt 二维地图库_Qt轻量级地图解决方案:基于QtLocation的二次开发(四)

發布時間:2023/12/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt 二维地图库_Qt轻量级地图解决方案:基于QtLocation的二次开发(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

在本系列的上一篇中,我將從《Qt之美1:數據指針和私有實現》中的例子抄過來,說明了Qt中源碼中(同時也是QtLcation模塊中)大量存在的D-P機制。這種設計模式實現了動態庫的二進制兼容,同時也隱藏了私有成員和潛在的實現細節;除此之外,還能基于它實現另一種Qt中大量采用的技術,即“隱式共享技術”。

以下關于“隱式共享技術”的說明內容,大多出自《Qt中的C++技術》這本書的第8章《隱式共享與d-pointer技術》。

一般地,一個類型的多個實例所占內存是相互獨立的,如果其中某些數據成員的取值完全相同,那么這些實例可共享這些數據成員,當某實例需要修改其中的數據成員時才為該對象重新分配內存;這種技術被稱為“隱式共享技術”,又被形象地描述為“寫時復制(copy on write)”。如下圖所示,假如對象O1、O2、O3和O4都有部分數據成員取值相同,都共享這部分數據成員所占用的內存A;此后需要修改O4位于共享內存A中的某個數據成員,此時不能直接修改內存A,否則會影響O1、O2和O3的數據成員;只好先復制將內存A復制成B,然后重新分配給O4,在B中修改O4需要修改的數據成員。

由于共享內存A的存在,假如要析構O3時,O1和O2還未析構,則不能簡單地釋放共享內存A,因為這樣做會使O1和O2受到牽連。只有當僅存在一個對象引用共享內存時,析構這個僅存的實例才完全釋放共享內存,其他時候僅需要“斷開”析構實例與共享內存的引用關系即可。這就需要維護一個共享內存的引用計數器(reference counter),每當析構了一個引用該塊共享內存的對象時,就減少一個引用計數,直到引用計數為1(即僅存一個引用該內存塊的對象)時,下一次再進行減少引用計數的操作(即析構引用該內存的對象)才會完全釋放這塊內存。

剛才我們講了同一類型不同實例之間實現隱式共享的基本原理,但這并不適用于所有應用場景。其實,Qt已經在“隱式共享技術”上為我們做了很多基礎性和示范性工作,其提供了一個名為QSharedData的共享數據類型,還提供了QSharedDataPointer等共享數據類的指針,利用QSharedData和QSharedDataPointer等類型就可以實現隱式共享的進階操作,比如同一基類不同子類之間的隱式共享。

了解QGeoShape為基類的地理數據類型

這里以QtPositioning中QGeoShape類型體系的源碼作為示例,QGeoShape是所有地理形狀類型的基類,其繼承者們包括:QGeoRectangle、QGeoCircle、QGeoPath和QGeoPolygon。QGeoShape類似于 Simple Feature標準 中的Geometry類型,但QGeoShape坐標點都是QGeoCoordinate類型,只能表示經緯高坐標。

QGeoShape的源碼如下:

class QGeoRectangle;

class QGeoShapePrivate;

class Q_POSITIONING_EXPORT QGeoShape

{

Q_GADGET

Q_PROPERTY(ShapeType type READ type)

Q_PROPERTY(bool isValid READ isValid)

Q_PROPERTY(bool isEmpty READ isEmpty)

Q_ENUMS(ShapeType)

public:

QGeoShape();

QGeoShape(const QGeoShape &other);

~QGeoShape();

enum ShapeType {

UnknownType,

RectangleType,

CircleType,

PathType,

PolygonType

};

ShapeType type() const;

bool isValid() const;

bool isEmpty() const;

Q_INVOKABLE bool contains(const QGeoCoordinate &coordinate) const;

Q_INVOKABLE QGeoRectangle boundingGeoRectangle() const;

Q_INVOKABLE QGeoCoordinate center() const;

Q_INVOKABLE void extendShape(const QGeoCoordinate &coordinate);

bool operator==(const QGeoShape &other) const;

bool operator!=(const QGeoShape &other) const;

QGeoShape &operator=(const QGeoShape &other);

Q_INVOKABLE QString toString() const;

protected:

QGeoShape(QGeoShapePrivate *d);

QSharedDataPointer d_ptr;

private:

inline QGeoShapePrivate *d_func();

inline const QGeoShapePrivate *d_func() const;

};

其給出了私有共享數據類型QGeoShapePrivate的前向聲明:

class QGeoShapePrivate : public QSharedData

{

public:

explicit QGeoShapePrivate(QGeoShape::ShapeType type);

virtual ~QGeoShapePrivate();

virtual bool isValid() const = 0;

virtual bool isEmpty() const = 0;

virtual bool contains(const QGeoCoordinate &coordinate) const = 0;

virtual QGeoCoordinate center() const = 0;

virtual QGeoRectangle boundingGeoRectangle() const = 0;

virtual void extendShape(const QGeoCoordinate &coordinate) = 0;

virtual QGeoShapePrivate *clone() const = 0;

virtual bool operator==(const QGeoShapePrivate &other) const;

QGeoShape::ShapeType type;

};

本來QGeoShapePrivate應該是QGeoShape的具體實現,但是由于QGeoShape被定義為抽象基類,QGeoShapePrivate中的接口都被定義為純虛函數,實際上QGeoShape接口都是在其子類對應的私有數據類型中具體實現的,比如QGeoRectanglePrivate(繼承自QGeoShapePrivate):

class QGeoRectanglePrivate : public QGeoShapePrivate

{

public:

QGeoRectanglePrivate();

QGeoRectanglePrivate(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight);

QGeoRectanglePrivate(const QGeoRectanglePrivate &other);

~QGeoRectanglePrivate();

bool isValid() const override;

bool isEmpty() const override;

bool contains(const QGeoCoordinate &coordinate) const override;

QGeoCoordinate center() const override;

QGeoRectangle boundingGeoRectangle() const override;

void extendShape(const QGeoCoordinate &coordinate) override;

QGeoShapePrivate *clone() const override;

bool operator==(const QGeoShapePrivate &other) const override;

QGeoCoordinate topLeft;

QGeoCoordinate bottomRight;

};

QGeoShape及其子類是地圖要素的幾何數據的主要表達形式。前端的MapPolyline、MapRectangle、MapCircle和MapPolygon等地圖元素(MapItem),其宿主對象是由后端Qt提供的QDeclarativePolylineMapItem、QDeclarativeRectangleMapItem、QDeclarativeCircleMapItem和QDeclarativePolygonMapItem等類型,它們的地理幾何數據(geoShape方法)就分別由QGeoPath、QGeoRectangle、QGeoCircle和QGeoPolygon的實例表示。

下面以QDeclarativeRectangleMapItem源碼為例:

class Q_LOCATION_PRIVATE_EXPORT QDeclarativeRectangleMapItem: public QDeclarativeGeoMapItemBase

{

Q_OBJECT

Q_PROPERTY(QGeoCoordinate topLeft READ topLeft WRITE setTopLeft NOTIFY topLeftChanged)

Q_PROPERTY(QGeoCoordinate bottomRight READ bottomRight WRITE setBottomRight NOTIFY bottomRightChanged)

Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)

Q_PROPERTY(QDeclarativeMapLineProperties *border READ border CONSTANT)

public:

explicit QDeclarativeRectangleMapItem(QQuickItem *parent = 0);

~QDeclarativeRectangleMapItem();

virtual void setMap(QDeclarativeGeoMap *quickMap, QGeoMap *map) override;

//from QuickItem

virtual QSGNode *updateMapItemPaintNode(QSGNode *, UpdatePaintNodeData *) override;

QGeoCoordinate topLeft();

void setTopLeft(const QGeoCoordinate &center);

QGeoCoordinate bottomRight();

void setBottomRight(const QGeoCoordinate &center);

QColor color() const;

void setColor(const QColor &color);

QDeclarativeMapLineProperties *border();

bool contains(const QPointF &point) const override;

const QGeoShape &geoShape() const override;

QGeoMap::ItemType itemType() const override;

Q_SIGNALS:

void topLeftChanged(const QGeoCoordinate &topLeft);

void bottomRightChanged(const QGeoCoordinate &bottomRight);

void colorChanged(const QColor &color);

protected:

void updatePath();

void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;

void updatePolish() override;

protected Q_SLOTS:

void markSourceDirtyAndUpdate();

virtual void afterViewportChanged(const QGeoMapViewportChangeEvent &event) override;

private:

QGeoRectangle rectangle_;

QDeclarativeMapLineProperties border_;

QColor color_;

bool dirtyMaterial_;

QGeoMapPolygonGeometry geometry_;

QGeoMapPolylineGeometry borderGeometry_;

bool updatingGeometry_;

QList pathMercator_;

};

總結

以上是生活随笔為你收集整理的qt 二维地图库_Qt轻量级地图解决方案:基于QtLocation的二次开发(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费a在线观看 | 蜜桃av噜噜一区二区三区网址 | 人人澡超碰碰97碰碰碰 | 精品日韩在线 | 天天舔天天 | 中文字幕一区二区三区在线不卡 | 精人妻一区二区三区 | 九九热超碰| 黄色国产在线观看 | 国精产品一区二区三区 | 日韩国产欧美 | 天天爽一爽 | 国产精品久久久久高潮 | 亚洲欧洲日产av | 妖精视频在线观看 | 亚洲射射 | 免费观看污网站 | 中文字幕――色哟哟 | 欧美一区永久视频免费观看 | 天天干天天干天天 | 国产伦精品一区二区三区照片91 | 91在线最新 | 亚洲女人视频 | 捆绑少妇玩各种sm调教 | 国产亚洲性欧美日韩在线观看软件 | 国产精品视频久久久 | 深夜福利免费在线观看 | 亚洲中文字幕无码不卡电影 | 97久草| 国外精品视频 | 免费小视频 | 亚洲国产精品成人综合久久久 | 男人的天堂成人 | 一进一出好爽视频 | 色哟哟一区二区三区四区 | www.日本在线观看 | av一级网站 | 草草草在线视频 | 少妇被躁爽到高潮无码文 | 在线免费观看中文字幕 | 午夜家庭影院 | 都市激情校园春色 | 老司机在线看片 | 欧美三日本三级少妇三级99观看视频 | 久久精彩视频 | 久在线观看 | 婷婷丁香六月 | 欧美影院 | 国产一区二区免费 | 少妇天堂网 | 中文字幕第5页 | 另类ts人妖一区二区三区 | 精品国产va久久久久久久 | 久久久国产一区二区三区 | 美女扒开尿口给男人捅 | av中文资源网 | 爱情岛论坛亚洲入口 | 国产欧美一区二区精品性色超碰 | 夜夜春夜夜爽 | 亚洲国产一区在线观看 | 国精产品一区一区三区免费视频 | 我们俩电影网mp4动漫官网 | 狠狠干超碰 | 大地资源二中文在线影视免费观看 | 国产91嫩草| 免费一级肉体全黄毛片 | 成人做爰69片免费 | 久久久久久久久久久影院 | 国产又粗又长 | 午夜免费影院 | 99免费在线观看 | 野花国产精品入口 | 97av超碰 | 亚洲播放器 | xxxxx毛片| 香蕉成人在线视频 | 男生插女生视频在线观看 | 欧美日韩一卡 | 欧美色狠 | 亚洲av永久无码精品一百度影院 | 亚洲成熟丰满熟妇高潮xxxxx | 久久人妖| 免费观看视频一区 | 亚洲色图25p | 免费无码av片在线观看 | 无码国产伦一区二区三区视频 | 男人的天堂手机在线 | 精品午夜一区二区三区 | 成了校长的性脔h文 | 国产香蕉97碰碰碰视频在线观看 | 亚洲国产电影在线观看 | 春闺艳妇(h)高h产乳 | 久草资源| 日日干日日摸 | 91视频进入 | 久久久久亚洲av成人片 | 亚洲AV成人午夜无码精品久久 | 亚洲人丰满奶水 | 毛片毛片女人毛片毛片 |