在qml中使用model给委托对象MapPolylIne的path属性赋值。

遇到两个崩溃的问题。

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

2、 定义clear()函数时使用  beginRemoveRows(QModelIndex(), 0, rowCount());m_datas.clear();endRemoveRows(); 程序也崩溃,原因不明。

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

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

但是更改成

1    int count =rowCount();
2    for(int index=0;index<count;index++)
3    {
4       beginRemoveRows(QModelIndex(), 0, 0);
5       m_datas.removeAt(0);
6       endRemoveRows();
7    }

就没问题。

代码如下:

MapItemView{
            model: situationTargetModel
            delegate:MapPolyline
            {
                line.width: 1
                line.color:‘red‘
                path:model.path

            }
        }
PathModel *pSituationTargetModel = new PathModel ();
m_quickView->rootContext()->setContextProperty("situationTargetModel",pSituationTargetModel);
#ifndef GEOPATH_H
#define GEOPATH_H

#include<QGeoPath>
#include<QGeoCoordinate>
#include<QVariantList>
class GeoPath
{
public:
    GeoPath();
    void addCoordinate(QGeoCoordinate &data);
    QVariantList path()const;

private:
    QVariantList mpath;

};

#endif // GEOPATH_H
#include "geopath.h"
#include<QDebug>
GeoPath::GeoPath()
{

}
void GeoPath::addCoordinate(QGeoCoordinate &data)
{
    mpath.append(QVariant::fromValue(data));
}

QVariantList GeoPath::path()const
{
    return mpath;
}
#ifndef PATHMODEL_H
#define PATHMODEL_H
#include<QAbstractListModel>
#include<QModelIndex>
#include<QVariant>
#include"geopath.h"

class PathModel : public QAbstractListModel
{
    Q_OBJECT
public:
    enum datatype{
        path=1
    };
    PathModel(QObject*  parent=NULL);

    //外部接口 C++调用 添加数据
    Q_INVOKABLE void  Add(GeoPath& path);
    void Add(QList<GeoPath> list);
    //外部接口 清除model
    Q_INVOKABLE void clear();
    //虚函数  qml内部调用  获取第index行的内容  role 内容索引
    QVariant data(const QModelIndex &index, int role =Qt::DisplayRole) const;
    //虚函数     获取model行数
    int rowCount(const QModelIndex &parent  = QModelIndex() ) const;
    // 虚函数 内容的别名  qml 内部调用
     QHash<int, QByteArray> roleNames()  const;

    ~PathModel() {}

private:
      //model数据集合
     QList<GeoPath> m_datas;
};

#endif // PATHMODEL_H
#include "pathmodel.h"
#include<QDebug>

PathModel::PathModel(QObject*  parent)
    :QAbstractListModel(parent)
{

}
//外部接口 C++调用 添加数据
void  PathModel::Add(GeoPath& path)
{
    qDebug()<<"PathModel::Add"  ;
    beginInsertRows(QModelIndex(), rowCount(), rowCount());
    m_datas.append(path);
    endInsertRows();
    qDebug()<<m_datas.size();
}

//外部接口 清除model
void PathModel::clear()
{
    int count =rowCount();
    for(int index=0;index<count;index++)
    {
        beginRemoveRows(QModelIndex(), 0, 0);
        m_datas.removeAt(0);
        endRemoveRows();
    }

}

//虚函数  qml内部调用  获取第index行的内容  role 内容索引
QVariant PathModel::data(const QModelIndex &index, int role) const
{
    qDebug()<<"PathModel::data"<<index.row()<<"total"<<m_datas.size();
    if (index.row() < 0 || index.row() >= m_datas.size())
    {
        return QVariant();
    }
    const GeoPath& d = m_datas[index.row()];
    if (role == datatype::path)
    {
        return QVariant::fromValue(d.path());

    }
    return QVariant();
}

// 虚函数 内容的别名  qml 内部调用
 QHash<int, QByteArray> PathModel::roleNames()  const
 {
     QHash<int, QByteArray>  d = QAbstractListModel::roleNames();
     d.insert(datatype::path,"path");
     return  d;
 }

//虚函数     获取model行数
int PathModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_datas.size();
}

void PathModel::Add(QList<GeoPath> list)
{
    int count = list.count();
    GeoPath d;
    for(int index =0;index<count;index++)
    {
        d = list.at(index);
        Add(d);
    }
}

原文地址:https://www.cnblogs.com/kabe/p/9496679.html

时间: 2024-08-30 09:09:48

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

对象Transform,对属性赋值

private void ContructRequest(Dictionary<string, string> dictionary, CustomerSearchRequest request)        {            for (int i = 0; i < dictionary.Count; i++)            {                var property = request.GetType().GetProperties().FirstOr

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

QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Qt C++实现,但QML对象的运行环境说到底和C++对象的上下文环境是不通的,是平行的两个世界,如果想在QML中访问C++对象,那么必然要找到一种途径在两个运行环境之间建立沟通的桥梁. Qt提供了两种在QML环境中使用C++对象的方式: (1)在C++中实现一个类,注册为QML环境的一个类型,在QML环境中使用该类型创建对象 (2)在C++中构造一个对象,将这个对象设置为QML的上下

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

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

DateTable映射到对象的字段和属性

DateTable映射到对象的字段和属性 简介: 作为一个菜鸟,因该有颗不甘做菜鸟的心.这里介绍一个C#中比较高级点的技术,反射技术.曾经有人说过当你懂了反射技术,就告别了菜鸟.这里先介绍一个反射的有趣例子.接下几天后来个系列讲解,希望大家收看. 问题: 将dataTable中的数据映射到对象的字段和属性.也是现在好多软件做的关系-对象映射技术.这里新建一个控制台程序. 实现小例子 1.首先创建一个用于实例化对象的类 <span style="font-size:18px;"&g

QML中的模型/视图 十二

QML中对于数据的存储和显示使用模型/视图框架. 1. QML数据模型 视图项目(如ListView.GridView和Repeater等)需要使用数据模型来为其提供数据进行显示.这些项目通常也需要一个委托(delegate)组件来为模型中的每一个条目创建一个实例.模型可以是静态的,也可以进行动态的修改.插入.移除或者移动项目.Qt帮助参考QML Data Models关键字. Item{ width:200; height:250 ListModel{ id:myModel ListEleme

Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

Qt qml中listview 列表视图控件(下拉刷新.上拉分页.滚动轴) 来源 https://www.cnblogs.com/surfsky/p/4352898.html 设置ListView涉及到将contentsY,即视图的可见部分的顶部,设置y为委托的值.另一个更改是interactive将视图设置为false.这样可以防止视图移动.用户不能再滚动列表或更改当前Item. contentY为列表上拉后列表左上角点距显示框左上解点的高度listView1.height为可显示部分的高度,

ORM中的Model与DDD中的DomainModel

0.引言 在现有的系统开发中,大部分的系统应该都会用到ORM,无论用的是EF还是NHibernate.作为对象和持久化数据的桥梁,ORM确实非常方便,以至于在DDD的时候,我们很自然的将 ORM中的Model(实体)表达成DDD中的 DomainModel(领域对象). 但这真的合理吗?我们先引入两个例子来探讨这个问题. 1.例子1:订单聚合 下述聚合引自汤神的博客: 我们看以上的聚合设计非常经典.Order对象作为聚合根,OrderItem建模成实体,只要在当前的订单聚合中不重复即可. 但在真

Django中的Model继承

Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由子 model 呈现. Django中有三种继承关系: 1.通常,你只是想用父 model 来保存那些你不想在子 model 中重复录入的信息.父类是不使用的也就是不生成单独的数据表,这种情况下使用抽象基类继承 Abstract base classes. 2.如果你想从现有的Model继承并让每个

Gradle 庖丁解牛(构建生命周期核心委托对象创建源码浅析)

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 上一篇<Gradle 庖丁解牛(构建源头源码浅析)>我们分析了 Gradle 框架自身初始化(非构建生命周期初始化)的核心流程,这一篇我们续着前面的分析继续(如果没看过前一篇的建议先去看前一篇,因为这一系列存在非常高的关联性).上一篇说到当我们执行 gradle taskName 命令后经过一系列艰难的框架初始化最终走到了 DefaultGradleLaunch