QML中ListView的C++模型(三)

QAbstractItemModel:用于Model-View架构的数据模型的抽象接口, QModelIndex用法 为了创建自定义的数据模型,需要继承类,并实现以下关键的虚函数:这些函数共同构成了的核心接口,通过实现这些函数,你可以创建自定义的数据模型,并与的视图组件进行交互。在实现这些函数时,需要根据你的数据模型的特点和业务逻辑来确定具体的实现方式。 1.3 QModelIndex 是中用于表示数据模型中项的索引的类。它提供了一种标准化的方法来唯一标识数据模型中的每个项,同时还提供了一些便利的方法来获取项的相关信息。可以作为的。是中的一个类型,它用于创建大量相似的项目。有一个模型和一个委托:对于模型中的每个条目,委托在 阅读详情

Model支持插入和删除行,需要自己添加插入和删除的函数,并且在插入函数中(插入数据前)调用

void QAbstractItemModel::beginInsertRows(const QModelIndex &parent, int first, int last)

插入数据完成后,调用

void QAbstractItemModel::endInsertRows();

类似地,在删除开始前调用:

void QAbstractItemModel::beginRemoveRows(const QModelIndex &parent, int first, int last)

删除完成后调用:

endRemoveRows();

在stringlistmodel.h文件中:

#ifndef STRINGLISTMODEL_H
#define STRINGLISTMODEL_H
#include <QAbstractListModel>
#include <QStringList>

class MyStringListModel : public QAbstractListModel
{
    Q_OBJECT
public:

    enum {
        DescriptionRole = Qt::UserRole,
    };

    explicit MyStringListModel(QObject *parent = nullptr);

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;

    QVariant data(const QModelIndex &index, int role) const override;

    virtual QHash<int, QByteArray> roleNames() const override;

    Qt::ItemFlags flags(const QModelIndex &index) const override;

    bool setData(const QModelIndex &index, const QVariant &value, int role) override;

    bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()) override;

    bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()) override;

    //为了演示添加的测试接口
    Q_INVOKABLE bool testInsertRows(int position, int rows);

    Q_INVOKABLE bool testRemoveRows(int position, int rows);

private:
    QStringList stringList;
};

#endif // STRINGLISTMODEL_H

在stringlistmodel.cpp中:

#include "stringlistmodel.h"

MyStringListModel::MyStringListModel(QObject *parent)
{
    Q_UNUSED(parent);

    stringList.append("111111");
    stringList.append("222222");
}

int MyStringListModel::rowCount(const QModelIndex &) const
{
    return stringList.count();
}

QVariant MyStringListModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (index.row() >= stringList.size())
        return QVariant();

    if (role == DescriptionRole)
        return stringList.at(index.row());
    else
        return QVariant();
}

Qt::ItemFlags MyStringListModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::ItemIsEnabled;

    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}

bool MyStringListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (index.isValid() && role == DescriptionRole)
    {
        stringList.replace(index.row(), value.toString());
        emit dataChanged(index, index);
        return true;
    }
    return false;
}

QHash<int, QByteArray> MyStringListModel::roleNames() const
{
    QHash<int, QByteArray> names;
    names[DescriptionRole] = "description";
    return names;
}

bool MyStringListModel::insertRows(int position, int rows, const QModelIndex &parent)
{
    if (position < 0 || position > stringList.size() || rows <= 0)
        return false;

    beginInsertRows(parent, position, position+rows-1);
    for (int row = 0; row < rows; ++row)
    {
        stringList.insert(position, "aaa"); //这里以为了演示,添加的是aaa,实际可以添加""
    }
    endInsertRows();
    return true;
}

bool MyStringListModel::removeRows(int position, int rows, const QModelIndex &parent)
{
    if ( !(position >= 0 && position <= stringList.size()-1) || rows <= 0)
        return false;

    beginRemoveRows(parent, position, position+rows-1);
    for (int row = 0; row < rows; ++row)
    {
        stringList.removeAt(position);
    }
    endRemoveRows();
    return true;
}

bool MyStringListModel::testInsertRows(int position, int rows)
{
    return insertRows(position, rows);
}

bool MyStringListModel::testRemoveRows(int position, int rows)
{
    return removeRows(position, rows);
}

在man.cpp中:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "stringlistmodel.h"
#include <QtQml>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    qmlRegisterType<MyStringListModel>("RegStringListModel", 1, 0, "MyStringListModel");

    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

main.qml文件中:

import QtQuick 2.9
import QtQuick.Window 2.2
import RegStringListModel 1.0
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    ColumnLayout {
        Frame {
            ListView {
                id: listViewId
                implicitWidth: 250
                implicitHeight: 250
                clip: true

                model: MyStringListModel {}

                delegate: RowLayout {
                    width: parent.width

                    TextField {
                        text: model.description
                        onEditingFinished:
                        {
                            model.description = text;
                            console.log("model.description is: ", model.description);
                        }
                        Layout.fillWidth : true
                    }
                }
            }
        } //end Frame

        RowLayout {
                Button {
                    text: qsTr("Add new item")
                    onClicked: listViewId.model.testInsertRows(listViewId.count, 1);
                    Layout.fillWidth: true
                }

                Button {
                    text: qsTr("Remove completed")
                    onClicked: listViewId.model.testRemoveRows(listViewId.count-1, 1);
                    Layout.fillWidth: true
                }
            }
    }
}

运行效果:
在这里插入图片描述

qml中树形结构控件TreeView的使用,以及其继承QAbstractItemModel的model的使用方式 阅读详情

相关推荐

ListView的使用——qml

前言 之前有一阵子一直写qml,现在隔了半年,已经忘得差不多了。如果不是看着以前的代码能回想起一些东西,我恐怕以为之前只是幻想罢了。 最近终于有点时间可以琢磨东西,或者说有时间选择用什么语言写,写成什么样的。正好现在有一个简单的界面,所以就拿来练手,用qml写一个稍微好看一点的界面。这个项目里面有一个列表展示,所以就用到了今天我想说的ListView了:ListView我觉得是最常用的了吧,特别他的一些基本东西,如model、delegate都是很多控件(GridView PathView)都需要配置的

xiaopei_yan的博客 6350

qml使用QAbstractListModel作为数据源

但是后台数据的提供还是用qt c++的实现,MVC中即可用Model进行。主要在于beginRemoveRows&endRemoveRows中间进行的操作,将待删除元素取出,在model实际数据存储处进行remove,最后再将元素彻底delete。主要在于beginMoveRows&endMoveRows中间进行的操作,将待移动项取出并插入到新位置。二、又例如想进行元素的删除,也需要model进行支撑。一、例如想进行元素的移动,就需要model进行支撑。但是想要一些其他的功能,就需要自己去实现了!

wisdomroc的博客 797

PyQt (PySide) 与 QML 互操作 - PyQt, QML ListView, model, QAbstractListModel

需求描述 我们需要通过 Python 操作 QML 对象, 使 QML 的 ListView 对象动态地加载元素. 实现 初始化 假设目录结构为: demo |- main.py |- MyItem.qml # 用于 view.qml 的列表元素. 注意文件名首字母必须大写, 否则 QML 导入机制不能引用. |- view.qml 最初的代码长这样: // === view.qml === ...

Likianta 的博客 4693

113-Model/View- 抽象模型QAbstractItemModel

QAbstractItemModel类定义了项目模型必须使用的标准接口,以便能够与模型/视图体系结构中的其他组件进行互操作。它不应该被直接实例化。相反,您应该将其子类化以创建新的模型。QAbstractItemModel类是模型/视图类之一,也是Qt模型/视图框架的一部分。它可以用作QML中项目视图元素或Qt-Widgets模块中项目视图类的底层数据模型。

***** 1374

QML QAbstractItemModel详解 之 TreeView使用

QML 之 TreeView使用,自定义Model,继承QAbstractItemModel

weixin_44641897的博客 755

C++listview控件(结合了树和选择框)

C++下的网格控件,可以在ListView中显示树,每个树节点可以有Checkbox选择框,可以在其中单元中插入图片,并且支持排序功能。可以通过+-号展开或者合并树节点。

QML笔记

在qml中自定义一个信号,将该信号的槽函数(on+首字母大写) 用Connections绑定到 全局对象中自定义的槽函数。第一种方法:首先是直接使用默认产生的槽汉数,如onClicked等(缺点:只能用于当前对象或其子对象中定义的信号)第二种方法:使用Connections连接自定义的信号和槽(需要连接非当前对象或其子对象的信号时)model(data)获取QML需要的数据,设置QML的属性,获取QML端的数据。这样的话,在qml中发信号,就可以调用c++中的槽函数。6.自定义组件与信号槽的使用。

apy123456的博客 1233

Qt qml的ListView等视图控件Models(QAbstractItemModel)的使用

Qt官方文档解析到提供支持类型QStringList, a QVariantList, a QObjectList or a QAbstractItemModel. 其中QAbstractItemModel提供复杂的数据模型. ​该例程是QAbstractItemModel与qml结合是怎么使用.

QML中ListView使用cpp的Model

ListView的模型可以直接在qml上使用ListModel、XmlListModel 、ObjectModel等。 但总有时候需要用到c++的模型,比如说后台数据动态刷新等。 ListView使用c++的模型,必须要继承QAbstractItemModel或者其子类。 为了方便以后查看和理解,本文先做一些讲解,在文章最后面有完整的代码可以查看。 第一步 创新一个模型类 利用Qt创建一个c++的类,并继承QAbstractListModel,QAbstractListModel是QAbstractItem

qq_23604781的博客 3818

从2D到3D地图开发:手把手教你用Cesium+Three.js实现卫星轨迹可视化(含代码片段)

本文详细介绍了如何结合Cesium与Three.js实现从2D到3D的卫星轨迹可视化。通过对比传统Web GIS框架的局限,阐述了Cesium处理三维地理与轨道数据、Three.js负责高级图形渲染的分工优势,并提供了从环境搭建、坐标同步到动态粒子效果实现的完整代码实战指南。

nut55的博客 673

共轭梯度法(Conjugate Gradient Method)

我们要求解线性方程组 Ax=bAx=b 其中AA 是对称正定矩阵(spd),给定RnR^n中n个线性无关的向量r0,r1,⋯,rn−1r_0,r_1,\cdots,r_{n-1}, 我们想要构造另外的一组基p0,p1,⋯,pn−1p_0,p_1,\cdots,p_{n-1}, 并满足 ⟨pi,pj⟩=0,∀i≠j\langle p_i, p_j\rangle=0,\quad \forall i

Liang_Ling的博客 1万+

QML类型——ListView

正文 为列表模型(ListModel)的所有元素提供列表视图。 详细说明 ListView显示内置QML类型(例如ListModel和XmlListModel)创建的模型数据,或者使用C++定义的自定义模型类(继承QAbstractItemModel或QAbstractListModel)创建的数据。 ListView有一个Model(定义要显示的数据)和一个Delegate(定义如何显示数据)。ListView中的元素可以水平或垂直放置。列表视图本质上是可以拖动的,因为ListView继承Flickabl

fengyanyu68的博客 8923

13 万字 C 语言从入门到精通保姆级教程2021 年版

13 万字C语言保姆级教程,从入门到精通。

李南江 61万+

qml-ListView

ListView 显示来自内置 QML 类型(如 ListModel 和 XmlListModel)创建的模型的数据,或在 C++ 中定义的从 QAbstractItemModel 或 QAbstractListModel 继承的自定义模型类。 ListView 有一个模型,它定义了要显示的数据,还有一个委托,它定义了数据应该如何显示。 ListView 中的项目水平或垂直布局。 列表视图本质上是可滑动的,因为 ListView 继承自 Flickable。 ...

LIJIWEI0611的博客 1728

从噪声中提取真相:LabVIEW振动信号积分处理的降噪艺术

本文深入探讨了LabVIEW在振动信号积分处理中的降噪技术,揭示了如何通过选择性频率加权从噪声中提取关键故障特征。详细介绍了时域和频域积分方法的实现原理及优化策略,并结合工业案例展示了多轴信号联合降噪的实际应用效果,为设备状态监测提供了高效解决方案。

weixin_29164185的博客 305

RK3588 ENV 环境配置之 fw_printenv

RK3588 ENV环境配置指南 本文详细介绍了在RK3588平台上配置ENV环境变量的完整流程。首先需要在parameter分区表中划分env分区,然后在U-Boot中配置MMC偏移地址。接着编译fw_printenv工具并部署到目标设备,配置fw_env.config文件指定存储位置。重点解决了内核中读写ENV时遇到的CRC校验问题,通过U-Boot的saveenv命令初始化环境变量存储区域。最后展示了如何使用fw_printenv/fw_setenv工具在内核中读写ENV变量,并建议将配置集成到根文件

501846585_QQAndroid_java 1036

QML中ListView的C++模型(二)

接上一篇,在stringlistmodel.h中添加 Qt::ItemFlags flags(const QModelIndex &index) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; 在stringlistmode...

斧冰 623

读懂 SAP Fiori Administration Catalogs:从管理员入口、权限编排到 Spaces 和 Pages 的落地实践

SAP Fiori 管理员目录的核心价值在于为系统配置提供标准化入口,解决权限与展示分离的问题。随着 SAP_UI 7.55 版本更新,SAP_FLP_ADMIN 角色整合了关键管理工具(如 Launchpad Designer、Content Manager),并通过 Business Catalog 和 Space 的协同作用,确保管理员既能访问配置工具,又能直观查看相关功能入口。项目实施中需注意配置层级(系统级/客户端级)的选择,以及多人协作时的数据同步问题,以提升交付效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 198

QML中ListView的几种数据模型

原文的博客写得比较清楚,可惜代码的排版有点不敢恭维,自己进行了缩进。 原文地址:https://blog.youkuaiyun.com/qq_35173114/article/details/80873842 在QML中,经常会用到ListView控件,我们主要用到MVC模式,下面介绍几种常用数据模型,其中包括QML和C++模型 方式一:ListModel: ListModel是一个简单的ListElemen...

斧冰 1281

基于 MFC C++ 的心电监测客户端

4. **报警功能**:使用 `PlaySound` 播放报警音(需准备 `alert.wav` 文件),界面显示报警状态。

寒寒豆豆软件公司的博客 95

华为OD机试真题 新系统【Skill执行链完整性检测】

华为OD机试 新系统真题【Skill执行链完整性检测】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【Skill执行链完整性检测】

qq_45776114的博客 765

QML视图(ListView)

如果模型不是按部分排序的,则创建的部分可能不是唯一的;不同部分之间的每个边界都将导致创建部分标题,即使该部分存在于其他地方也是如此。保存过渡以应用于视图中由于视图模型中的移动操作而移动的项。保存转换以应用于视图中因删除视图中的其他项而替换的项。保存转换以应用于视图中因添加视图中的其他项而替换的项。保存过渡以应用于视图模型中的移动操作所取代的项。当前的部分:保存当前位于视图开头的部分。保存从突出显示组件创建的突出显示项。保存要应用于从视图中删除的项的过渡。保存要应用于从视图中添加的项的过渡。

qq_45303986的博客 4290

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

QML类型:ListView

一、描述 ListView 继承自 Flickable,用作显示来自内置 QML 类型(如 ListModel 和 XmlListModel)或从 QAbstractItemModel 或 QAbstractListModel 继承的 C++ 中定义的自定义模型类创建的模型中的数据。 二、使用示例 import QtQuick 2.12 import QtQuick.Window 2.0 Window { id:root; visible: true; width: 20.

友善啊,朋友的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)

在上一篇中介绍了ListView的数据交互与样式定制后,本文上一点强度,将通过一个联系人管理的案例,详细介绍如何使用QML与C++进行混合开发,充分展示QML的界面设计优势和C++的数据处理能力。该应用基于ListView & Model实现了联系人的增删改查等基本功能,并通过自定义组件提升了用户体验。

u011186532的专栏 1709

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

QML中ListView的C++模型(一)

在Model-View_delegate框架中,C++自己定义的Model一直都没有完全掌握,现在对自己学到的做一些简单的总结和用例子来展示。 例子一: main.qml中 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.0 Window { ...

斧冰 1743

QML ListView 鼠标拖拽交换行

QML 的 ListView 本身有 move 过渡(Transition)属性,可以用来做一些交换动画效果。其中 move 为当前项的过渡,moveDisplaced 为被交换项的过渡。鼠标拖拽可以用一个 MouseArea 来实现,当鼠标滑动到相邻行后就调用 model 的 move 接口,这样就会触发 view 的 move 过渡动画。效果如下: 感觉有点生硬,勉强能用。 完整代码如下: import QtQuick 2.12 import QtQuick.Window 2.12 //演

龚建波 3332
上一篇: QML中ListView的C++模型(二)
下一篇: qml中text显示不同颜色或大小的文字
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值