遇到两个崩溃的问题。

1、A线程中给赋值了变量 listA, 线程B中使用函数Add(QList<GeoPath> &list),由于在其函数中调用了list.at(index),所以当listA对象改变时会使得引用而来的list导致索引越界。

2、MapPolyline 中的path 可以用setPath 进行赋值,其参数类型是QGeoPath,但是使用model模式不能用QList<QGeoPath> mpath来传递值,只能用

  1. QVariantList mpath,而mapPolyline 不是委托对象时,可以调用 QGeoPath fun()的函数直接给path赋值。

代码如下:

  1. MapItemView{
  2. model: situationTargetModel
  3. delegate:MapPolyline
  4. {
  5. line.width:
  6. line.color:'red'
  7. path:model.path
  8.  
  9. }
  10. }
  1. PathModel *pSituationTargetModel = new PathModel ();
  2. m_quickView->rootContext()->setContextProperty("situationTargetModel",pSituationTargetModel);
  1. #ifndef GEOPATH_H
  2. #define GEOPATH_H
  3.  
  4. #include<QGeoPath>
  5. #include<QGeoCoordinate>
  6. #include<QVariantList>
  7. class GeoPath
  8. {
  9. public:
  10. GeoPath();
  11. void addCoordinate(QGeoCoordinate &data);
  12. QVariantList path()const;
  13.  
  14. private:
  15. QVariantList mpath;
  16.  
  17. };
  18.  
  19. #endif // GEOPATH_H
  1. #include "geopath.h"
  2. #include<QDebug>
  3. GeoPath::GeoPath()
  4. {
  5.  
  6. }
  7. void GeoPath::addCoordinate(QGeoCoordinate &data)
  8. {
  9. mpath.append(QVariant::fromValue(data));
  10. }
  11.  
  12. QVariantList GeoPath::path()const
  13. {
  14. return mpath;
  15. }
  1. #ifndef PATHMODEL_H
  2. #define PATHMODEL_H
  3. #include<QAbstractListModel>
  4. #include<QModelIndex>
  5. #include<QVariant>
  6. #include"geopath.h"
  7.  
  8. class PathModel : public QAbstractListModel
  9. {
  10. Q_OBJECT
  11. public:
  12. enum datatype{
  13. path=
  14. };
  15. PathModel(QObject* parent=NULL);
  16.  
  17. //外部接口 C++调用 添加数据
  18. Q_INVOKABLE void Add(GeoPath& path);
  19. void Add(QList<GeoPath> list);
  20. //外部接口 清除model
  21. Q_INVOKABLE void clear();
  22. //虚函数 qml内部调用 获取第index行的内容 role 内容索引
  23. QVariant data(const QModelIndex &index, int role =Qt::DisplayRole) const;
  24. //虚函数 获取model行数
  25. int rowCount(const QModelIndex &parent = QModelIndex() ) const;
  26. // 虚函数 内容的别名 qml 内部调用
  27. QHash<int, QByteArray> roleNames() const;
  28.  
  29. ~PathModel() {}
  30.  
  31. private:
  32. //model数据集合
  33. QList<GeoPath> m_datas;
  34. };
  35.  
  36. #endif // PATHMODEL_H
  1. #include "pathmodel.h"
  2. #include<QDebug>
  3.  
  4. PathModel::PathModel(QObject* parent)
  5. :QAbstractListModel(parent)
  6. {
  7.  
  8. }
  9. //外部接口 C++调用 添加数据
  10. void PathModel::Add(GeoPath& path)
  11. {
  12. qDebug()<<"PathModel::Add" ;
  13. beginInsertRows(QModelIndex(), rowCount(), rowCount());
  14. m_datas.append(path);
  15. endInsertRows();
  16. qDebug()<<m_datas.size();
  17. }
  18.  
  19. //外部接口 清除model
  20. void PathModel::clear()
  21. {
  22. int count =rowCount();
  23. for(int index=;index<count;index++)
  24. {
  25. beginRemoveRows(QModelIndex(), , );
  26. m_datas.removeAt();
  27. endRemoveRows();
  28. }
  29.  
  30. }
  31.  
  32. //虚函数 qml内部调用 获取第index行的内容 role 内容索引
  33. QVariant PathModel::data(const QModelIndex &index, int role) const
  34. {
  35. qDebug()<<"PathModel::data"<<index.row()<<"total"<<m_datas.size();
  36. if (index.row() < || index.row() >= m_datas.size())
  37. {
  38. return QVariant();
  39. }
  40. const GeoPath& d = m_datas[index.row()];
  41. if (role == datatype::path)
  42. {
  43. return QVariant::fromValue(d.path());
  44.  
  45. }
  46. return QVariant();
  47. }
  48.  
  49. // 虚函数 内容的别名 qml 内部调用
  50. QHash<int, QByteArray> PathModel::roleNames() const
  51. {
  52. QHash<int, QByteArray> d = QAbstractListModel::roleNames();
  53. d.insert(datatype::path,"path");
  54. return d;
  55. }
  56.  
  57. //虚函数 获取model行数
  58. int PathModel::rowCount(const QModelIndex &parent) const
  59. {
  60. Q_UNUSED(parent);
  61. return m_datas.size();
  62. }
  63.  
  64. void PathModel::Add(QList<GeoPath> list)
  65. {
  66. int count = list.count();
  67. GeoPath d;
  68. for(int index =;index<count;index++)
  69. {
  70. d = list.at(index);
  71. Add(d);
  72. }
  73. }

代码优化

  1. void PathModel::Add(QList<GeoPath> list)
  1. {
  1. int count = list.count();
  1. beginResetModel();
  1. m_datas.clear();
  1. m_datas.append(list);
  1. beginInsertRows(QModelIndex(), 0, count-1);
  1. endResetModel();
  1. }
  1. void PathModel::clear()
  1. {
  1. int count =rowCount();
  1. if(count>0)
  1. {
  1. beginRemoveRows(QModelIndex(), 0, count-1);
  1. m_datas.clear();
  1. endRemoveRows();
  1. }
  1.  
  1. }

在qml中使用model给委托对象MapPolylIne的path属性赋值。的更多相关文章

  1. 在 QML 中使用 C++ 类和对象

    Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...

  2. QT之在QML中使用C++类和对象

    QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Qt C++实现,但QML对象的运行环境说到底和C++对象的上下文环境是不通的,是平行的 ...

  3. JQuery中formSerialize()报错:对象不支持"formSerialize"属性或方法

    formSerialize()是jQuery的表单插件中提供的方法. formSerialize()的核心方法是:$.param(data); Form表单经过formSerialize(),被序列化 ...

  4. vue中,怎么给data对象添加新的属性?(尼玛这面试题居然让我给碰上了。。。。)

    Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: <template> <div> <ul> <li v-for="v ...

  5. 应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用

    此时会输出两个null. Users类的实例是myUsers,但是由于javabean的作用范围是page,所以前面页面传送的javabean的设置的属性全部不能接收到.所以对象myUsers属性为自 ...

  6. 对象Transform,对属性赋值

    private void ContructRequest(Dictionary<string, string> dictionary, CustomerSearchRequest requ ...

  7. IE浏览器提示对象不支持“append”属性或方法

    如下代码在IE浏览器中无法执行,提示对象不支持“append”属性或方法 var tImg = document.createElement("img"); tImg.setAtt ...

  8. 九、Spring中使用@Value和@PropertySource为属性赋值

    首先回顾下在xml中我们是如何为spring的bean进行属性赋值呢? 大体是这样的 <bean id="person" class="com.atguigu.be ...

  9. [转载]震惊!QWidget竟然可以嵌入到QML中,QMl窗口句柄竟然是这样获取

      背景 记得在初学qml时,就被大佬告知Qml的实现有两种方式“view+item”和“engine+widow”,那么能不能将QWidget嵌入到QML中来呢,我收到的答案是不可以,原因是QML的 ...

随机推荐

  1. 简单即时通讯、聊天室--java NIO版本

    实现的功能: 运行一个服务端,运行多个客户端.在客户端1,发送消息,其余客户端都能收到客户端1发送的消息. 重点: 1.ByteBuffer在使用时,注意flip()方法的调用,否则读取不到消息. 服 ...

  2. Java版Kafka使用及配置解释

    Java版Kafka使用及配置解释 一.Java示例 kafka是吞吐量巨大的一个消息系统,它是用scala写的,和普通的消息的生产消费还有所不同,写了个demo程序供大家参考.kafka的安装请参考 ...

  3. kvm第四章-- 虚拟化网络管理

  4. Fortify漏洞之Sql Injection(sql注入)

    公司最近启用了Fortify扫描项目代码,报出较多的漏洞,安排了本人进行修复,近段时间将对修复的过程和一些修复的漏洞总结整理于此! 本篇先对Fortify做个简单的认识,同时总结一下sql注入的漏洞! ...

  5. Mysql踩坑 自动更新的时间只允许有一个

    执行如下SQL创建表: CREATE TABLE aa ( a INT, b TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, c TIMESTAMP DEFAULT CU ...

  6. CentOS7安装CDH 第十一章:离线升级CDH版本

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  7. Android笔记(二十六) Android中的广播——BroadcastReceiver

    为了方便进行系统级别的消息通知,Android有一套类似广播的消息机制,每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能是来自于系统,也可能是来自于 ...

  8. 异常-Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=hdfs, access=WRITE, inode="/hbase":root:supergroup:drwxr-xr-x

    1 详细异常 Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlExce ...

  9. 用js刷剑指offer(最小的K个数)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 牛客网链接 js代码 function GetLeastNumbe ...

  10. PowerMockito单元测试中的Invalid use of argument matchers问题详解

    首先,简单说说PowerMockito进行单元测试的三部曲: 打桩,即为非测试目标方法设置返回值,这些返回值在测试目标方法中被使用.执行测试,调用测试目标方法.验证测试结果,如测试方法是否被执行,测试 ...