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

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

接上一篇,在stringlistmodel.h中添加

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

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

在stringlistmodel.cpp中添加:

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

这里还是贴出全部代码:
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;

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

    bool setData(const QModelIndex &index, const QVariant &value, int role) 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;
}


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

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的数据是有改变的。

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

相关推荐

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使用cpp的Model

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

qq_23604781的博客 3818

上证指数30年k线图_金融占星简单解读上证指数30年历史行情

阅读此文需要一定的占星基础知识,本人对于金融知识了解甚少,如有描述错误请包涵指正!影响大众事件发展趋势的都是外行星,即木星-冥王星这5颗,由于时间跨度长达30年,绘制社会行星的K线图工作量太大,所以只以时代行星对这30年行情的简单解读作为分享,在今后的短期分析中会逐渐加入社会行星,甚至在个股分析上还会加入个人行星。那即使只绘制时代行星,所展现出来的信息也无法在一张图上画出来,否则太乱难以分辨,所以...

weixin_39831242的博客 1675

qml中 ListView/ListModel 从c++获取数据 qml和c++交互

2 qml中进行解析。

sxczzZ的博客 1218

均值场博弈_平均场博弈(mean field game)

The New Big Fish Called Mean-Field Game Theory原文链接http://www.science4all.org/article/mean-field-games/​www.science4all.org主要内容在经典博弈论中,它对附近其他鱼类的行为做出反应。这是非常复杂的,因为不同的鱼类之间会有大量的相互作用。这意味着经典博弈论对应于一长串高度耦合的方程。...

weixin_34773479的博客 3684

避开RK3588开发板SDIO配置的坑:O9201SB WiFi模组接入实战指南

本文为嵌入式开发者提供了在RK3588开发板上,利用TF卡槽接入O9201SB WiFi6模组的实战指南。文章深度剖析了SDIO配置中常见的电源管理序列冲突问题,并给出了从设备树节点修改、内核编译到系统验证的完整解决方案,帮助开发者避开配置陷阱,成功实现高性能无线连接。

sprite的博客 954

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

QML学习

5043

【变化检测】变化检测相关数据集+代码+论文合集

光学影像变化检测领域数据集(有label的,无label的)、高光谱影像变化检测领域数据集、3D变化检测领域数据集、传统变化检测算法、深度学习变化检测算法、SAR变化检测算法、高光谱变化检测算法论文及代码等资源。

向上生长的程序媛的博客 2090

QML学习十五:ListView的简单使用(内建Model)

QML

5727

C# 量子级跨平台开发:用Uno Platform实现Windows、iOS、Android的“量子纠缠”UI同步

墨瑾轩推出编程学习平台,通过XAML的“量子纠缠”技术,实现跨平台开发的高效与一致性。传统方案中,多平台代码重复率高,UI差异大,而量子级方案则通过一套代码构建全平台应用,UI原子化同步,开发效率提升5倍。Uno Platform的“量子纠缠”架构解决了代码碎片化、性能瓶颈和调试难题,实现UI原子化同步、性能提升300%和跨平台数据无缝同步。核心架构包括XAML的跨平台渲染、MVVM的量子叠加态架构、平台差异的量子退相干处理以及性能优化的量子隧穿效应,为开发者提供高效、一致的跨平台开发体验。

java专栏 1165

cesium 淹没分析

cesium淹没分析

God's asylum的博客 483

qml 实现一个listview

通过qml实现listview的主要功能,菜单,滚动条,拖动改变内容等

foxgod的专栏 1344

大模型量化方法总结

本文主要对大模型量化方法进行了总结,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 模型精度 3. 量化方法 3.1 方法一 3.2 方法二 3.3 方法三

herosunly的博客 1万+

QML类型——ListView

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

fengyanyu68的博客 8923

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

qml-ListView

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

LIJIWEI0611的博客 1728

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

QML中ListView的几种数据模型

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

斧冰 1281

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

QML视图(ListView)

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

qq_45303986的博客 4290

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

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

斧冰 1020

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

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 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 与 C++ 模型交互

这是最强大和灵活的方式,适合复杂数据结构。是中的一个关键方法,它在 QML 与 C++ 模型交互中扮演着重要角色。这个方法定义了模型中可用的数据角色及其对应的名称。通常在模型头文件中定义角色枚举:cppQ_OBJECTpublic:NameRole = Qt::UserRole + 1, // 从UserRole开始避免与内置角色冲突ColorRole,SizeRole,// 添加更多角色...// ...

深之JohnChen的专栏 707

QML与C++:基于ListView调用外部模型进行增删改查(性能优化版)

本文将以一个能够流畅处理10万条联系人数据的QML应用为例,详细介绍如何利用Qt的模型-视图架构和QSortFilterProxyModel实现高性能的数据筛选和展示功能。通过这个实例,读者可以了解Qt Model & View在大数据量处理方面的优势以及相关的开发技巧。

u011186532的专栏 1342
上一篇: QML中ListView的C++模型(一)
下一篇: 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、付费专栏及课程。

余额充值