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

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

在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 {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Frame {
        ListView {
            implicitWidth: 250
            implicitHeight: 250
            clip: true

            model: ListModel {
                ListElement {
                    description: "Wash the car"
                }
                ListElement {
                    description: "fix the sink"
                }
            }

            delegate: RowLayout {
                width: parent.width

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

在这里插入图片描述
运行效果:
在Qt Creator中可以看到每次编辑完,能看到:
在这里插入图片描述
说明这个是可以编辑的,也就是编辑的数据能反馈到model中。
看到这个简单的ListView例子,现在用C++来写Model。
一、只读模型

    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;

要重写这个四个接口。
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 = DescriptionRole) const override;

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

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();
}

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

main.cpp

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

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")

    Frame {
        ListView {
            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
                }
            }
        }
    }
}

运行效果:
在这里插入图片描述
在这里插入图片描述
在console.log输出的可以看出,其实model的数据是没有改变的。
接下来就在C++的model类中重写两个接口,就可以实现对model数据的修改。

QML使用C++ model(基本用法) C++model与QML 阅读详情

相关推荐

qml的自定义model初始化数据后,后续能自定义增加或删除数据吗

QML中的自定义Model是继承自 QAbstractListModel 的C++类,可以在C++中为它添加自定义的增加、删除和修改数据等操作方法,并将这些方法封装到Qt属性系统中,以此来实现对模型进行数据操作的能力。这个方法会向 m_dataList 中添加一条数据,然后通过调用 beginInsertRows() 和 endInsertRows() 函数来发出通知,以便在QML中更改视图。

weixin_43972388的博客 643

QML学习十六:ListView的简单使用(使用C++ Model)

QML学习

5043

QML Data Models 数据模型<一>

在QML中,ListView、GridView、Repeater 需要数据模型提供数据,然后在显示。而如何显示则需要一个代理(delegate)来定义。模型可以是静态的,也能够动态添加删除或修改。delegate可以绑定到model的date roles 。例如: i

Open Source Project Share的专栏 4361

QML中ListView使用cpp的Model

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

qq_23604781的博客 3818

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

QML 自定义TableView控件(在ListView基础上实现类似QTableView功能)

在Qt5.12以前的版本中,对于数据的显示控件有 QtQuick.Controls 2中的ListView, QtQuick.Controls 1中的TableView,而 QtQuick.Controls 1的控件风格和操作习惯不符合QML的整体风格,因此我在ListView的基础上制作了TableView,提供了类似于QTableView中只需要提供model,表头、表数据等等由控件自动绑定相应属性,且控件在保留ListView所有属性的同时,添加了自定义表头,表头默认宽度、表头颜色、字体颜色、表头高度

zjgo007的专栏 6788

QML类型——ListView

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

fengyanyu68的博客 8923

QML 中使用 QAbstractListModel 作为 ListView 的 model 实例 2

这篇比 上篇 的要好理解很多,接地气一点 主要是几个虚函数的实现,可查看QAbstractListModel的父类 主要是对内部维护的动态数组进行操作 具体实现: #ifndef MYMODEL_H #define MYMODEL_H #include <QAbstractListModel> #include <QHash> #include <QList>...

波风水门 3228

qml-ListView

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

LIJIWEI0611的博客 1728

AD服务器搭建

一、角色安装1)打开服务器管理器,添加 角色和功能;2) 点 下一步;3)点 下一步;4)点 下一步;5)点击安装;6-1)将此服务器提升为域控制器;6-2)点下一步;6)输入密码 点 下一步;7)自动生成LIXF,点击下一步;8)确认目录,点下一步;8)确认安装条件,点安装; 8)安装成功,点关闭;...

潇峰的博客 6455

小米手机免登录开启USB安装与调试(MIUI 9-11实测,已Root可用)

本文详细介绍了小米手机免登录开启USB安装与调试的底层方案,适用于已Root的MIUI 9-11版本设备。通过修改系统配置、禁用MIUI安装器验证和强制开启USB调试等步骤,帮助开发者绕过账号限制,实现快速调试。文章包含不同MIUI版本的兼容性处理和常见问题解决方法,实测有效。

weixin_33675507的博客 290

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

WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法

WSL运行make提示/lib//modules/xxx文件或目录不存在。 WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。

weixin_45668903的博客 1万+

QML中ListView的几种数据模型

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

斧冰 1281

Dify 从入门到精通:第一篇 - 基础介绍与快速上手

Dify是一个开源的低代码平台,旨在简化大型语言模型(LLM)应用的开发流程。本文作为"Dify从入门到精通"系列的首篇,全面介绍了Dify的核心概念、安装步骤和基本使用方法。文章首先解析了Dify的多模型支持、低代码开发等特点,然后详细讲解了基于Docker的安装配置过程,包括系统要求、环境变量设置等。通过创建一个邮件助手应用的实际示例,展示了Dify的可视化工作流设计功能。最后简要介绍了高级特性和最佳实践,为后续深入学习奠定基础。本文为开发者提供了从零开始使用Dify构建AI应用的完

IT深耕十余载,大道之简 1151

三边定位的最小二乘法运用

已知:条件基站到移动台的距离D,基站的坐标(xi,yi,zi) 求:移动台的坐标(x,y,z) 运用最小二乘法的核心是找到最小二乘法的矩阵形式即 Ax=B 在本次实验中通过三边定位计算得到 A=[A;2*(xi-x1),2*(yi-y1),2*(zi-z1]; %系数矩阵A b=[b;D1^2-Di^2+xi^2+yi^2+zi^2-x1^2-y1^2-z1^2]; %增广矩阵b

qq_26250141的博客 1万+

QML视图(ListView)

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

qq_45303986的博客 4290

工业模型导入Unity实战:从ProE/SolidWorks到实时渲染的完整流程

在工业仿真、数字孪生和VR/AR应用开发中,将高精度工程模型导入实时渲染引擎是一个常见的技术挑战。其核心原理在于参数化工程软件与实时渲染引擎的数据结构差异:前者基于精确的B-rep边界表示和特征树,后者依赖轻量化的三角网格与材质贴图。这一转换的技术价值在于实现工程数据的可视化与交互化,为产品展示、虚拟培训和工厂仿真等应用场景提供基础。通过数据翻译与优化流程,特别是利用3ds Max或Blender作为中转站进行网格优化与UV展开,能够有效解决模型破面、材质丢失和性能问题。本文聚焦于ProE(Creo)和So

weixin_33050117的博客 345

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

Model支持插入和删除行,需要自己添加插入和删除的函数,并且在插入函数中(插入数据前)调用 void QAbstractItemModel::beginInsertRows(const QModelIndex &parent, int first, int last) 插入数据完成后,调用 void QAbstractItemModel::endInsertRows(); 类似地,在...

斧冰 1020

envi5.3处理高分二号影像数据详细过程记录

全文根据此篇文章进行数据处理: tm影像辐射定标_高分二号影像数据预处理及裁剪过程 其他参考: 学习笔记---遥感影像辐射定标与大气校正 利用ENVI自带全球DEM数据计算区域平均高程 高分二号数据处理流程(有高分二号的数据信息) GF2有多光谱和全色两个数据,MSS是多光谱的,PAN是全色的,多光谱的分辨率低,全色的高,需要把这两个数据融合,融合之前需要做定标等处理,获取经纬度。 一、多光谱影像处理 1. 辐射定标 以这个为例: 其他路径\2022.4.2...

ligous的博客 5万+

基于LSTM算法实现交通流量预测(Pytorch版)

本研究采用PyTorch框架,设计并实现了一种基于LSTM(Long Short-Term Memory)网络的交通流量预测模型。针对时序性显著的交通流量数据,模型首先将多节点、多通道的时空信息整合为一维特征输入至多层LSTM单元,利用其捕捉长期依赖及短期波动的能力进行深度学习。全连接层随后调整时间步长以适应预测周期需求。模型结构灵活,能适应不同节点数、输入输出长度及通道配置,实现在给定历史流量数据基础上对未来交通流量的精准预测,为交通管理与规划提供数据驱动支持。

打酱油的葫芦娃 4641

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

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

u011186532的专栏 1709

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

QML ListView 鼠标拖拽交换行

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

龚建波 3332

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

QML Repeater、ListView、TableView

例如,可以设置ListView的orientation属性来控制列表是水平显示还是垂直显示,可以设置spacing属性来设置项之间的间距,可以设置highlightRangeMode属性来设置高亮显示的项的范围。例如,可以使用currentIndex属性来获取当前选中项的索引,可以使用currentItem属性来获取当前选中项的对象,可以使用onClicked信号来处理项的点击事件。总之,ListView是QML中非常强大和灵活的元素,可以用于创建各种类型的列表,并可以方便地自定义列表项的外观和行为。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1558
上一篇: QML中ListView向上滚动效果
下一篇: QML中ListView的C++模型(二)
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值