当前位置: 首页 > news >正文

QT M/V架构开发实战:QStringListModel介绍

目录

    • @[TOC](目录)
  • 前言
  • 一、QStringListModel初步介绍
  • 二、基本功能
      • 1.创建
      • 2.基本属性与方法
  • 三、​何时使用 QStringListModel?​​
  • 四、​何时避免使用 QStringListModel?​​

前言


本文主要介绍的是使用代码生成的情况下对控件的介绍,包括拥有的功能及能修改的样式,也会说明在qtdesiner拖拽控件生成和使用代码生成控件的区别(如果有的话,遇到了的会说),此版本不属于最终版本,以后遇到什么新奇的点会继续更新!本文基于QT官方的文档进行的编写,QT版本为qt 5.14.0,编写环境为Windows11。不得不说官方文档真是个好东西,有时候有些不会的上去一看就能有灵感解决了,可惜没有中文版本的。

一、QStringListModel初步介绍

QStringListModel是一个专门为处理简单的字符串列表 (QStringList) 而设计的轻量级模型,是 QAbstractListModel的子类(因此它只支持单列数据)。它非常高效且易于使用,特别适合在列表视图 (QListView)、下拉框 (QComboBox) 或列表控件 (QListWidget内部使用模型时) 中显示一维的字符串数据。

核心思想:​​
1、QStringListModel内部封装了一个 QStringList。
2、将 QStringList中的每个字符串映射为模型中的一行(索引为 row,列固定为 0)。
3、自动实现了 QAbstractListModel要求的核心接口 (rowCount, data, setData, flags, insertRows, removeRows等)。

二、基本功能

1.创建

// 创建一个空模型
QStringListModel *model = new QStringListModel(parent);// 创建时用字符串列表初始化
QStringList initialList;
initialList << "Apple" << "Banana" << "Orange";
QStringListModel *model = new QStringListModel(initialList, parent);

2.基本属性与方法

1)设置和获取字符串列表

// 设置整个字符串列表 (会重置模型)
QStringList fruits;
fruits << "Apple" << "Banana" << "Cherry";
model->setStringList(fruits);// 获取模型当前持有的整个字符串列表
QStringList currentList = model->stringList();

2)获取行数

int count = model->rowCount(); // 等同于 model->stringList().size()

3)获取数据 (data())

// 获取指定行 (row) 的字符串 (列固定为 0)
QModelIndex index = model->index(row, 0); // 创建行的索引
QString itemText = model->data(index, Qt::DisplayRole).toString(); // 获取显示文本
// 也可以直接获取 EditRole,对于字符串通常和 DisplayRole 一样
QString editText = model->data(index, Qt::EditRole).toString();

4)修改数据 (setData())

QModelIndex index = model->index(row, 0);
bool success = model->setData(index, "New Fruit Name", Qt::EditRole);
// 如果成功,模型会:
//   1. 更新内部 QStringList 对应位置的字符串
//   2. 自动发射 dataChanged(index, index) 信号通知视图更新

5)​检查标志 (flags())

// 默认 flags 包含 Qt::ItemIsEditable
Qt::ItemFlags f = model->flags(index);
if (f & Qt::ItemIsEditable) {qDebug() << "Item is editable";
}
// 如果你想禁用特定项的编辑(虽然不常见):
// 需要继承 QStringListModel 并重写 flags(index) 方法

6)​插入行 (insertRows())

// 在 row 位置插入 count 行空字符串
model->insertRows(row, count);
// 或者插入后立即设置数据
model->insertRows(row, 1); // 插入一行
QModelIndex newIndex = model->index(row, 0);
model->setData(newIndex, "Inserted Fruit", Qt::EditRole);

7)删除行 (removeRows())

// 删除从 row 开始的 count 行
model->removeRows(row, count);

8)​追加行

int newRow = model->rowCount();
model->insertRows(newRow, 1); // 在末尾插入一行
model->setData(model->index(newRow, 0), "New Fruit", Qt::EditRole);
// 或者直接操作 stringList 再 set
QStringList list = model->stringList();
list.append("New Fruit");
model->setStringList(list); // 注意:这会重置模型,发出 modelReset 信号

9)​排序 (sort())

// 升序排序 (默认)
model->sort(0); // 参数是列号,对于 QStringListModel 只能是 0// 降序排序
model->sort(0, Qt::DescendingOrder);// 自定义排序规则 (需要继承 QStringListModel 并重写 lessThan)
class MyStringListModel : public QStringListModel {
protected:bool lessThan(const QModelIndex &left, const QModelIndex &right) const override {QString leftStr = data(left, Qt::DisplayRole).toString();QString rightStr = data(right, Qt::DisplayRole).toString();// 例如:不区分大小写排序return leftStr.toLower() < rightStr.toLower();// 或者按字符串长度排序// return leftStr.length() < rightStr.length();}
};
// 然后使用你的自定义模型
MyStringListModel *customModel = new MyStringListModel;
customModel->setStringList(fruits);
customModel->sort(0); // 会使用你重写的 lessThan

10)​​与视图连接

QListView *listView = new QListView;
listView->setModel(model); // 关键一步!// 或者用于 QComboBox
QComboBox *comboBox = new QComboBox;
comboBox->setModel(model); // 下拉选项即为字符串列表

三、​何时使用 QStringListModel?​​

数据是简单的一维字符串列表。​​ 这是最重要的前提。

​​需要将字符串列表显示在 QListView, QComboBox或其他支持模型的列表控件中。​​

​​需要支持基本的操作:​​ 显示、编辑、排序、增删行。

​​追求效率和轻量:​​ 数据量可能较大,使用 QStandardItemModel为每个字符串创建 QStandardItem开销过大。

​​数据源本身就是一个 QStringList。​​

四、​何时避免使用 QStringListModel?​​

​数据不是简单的字符串列表:​​ 需要显示图标、颜色、字体等额外信息,或者数据是多列的(表格)。此时应使用 QStandardItemModel或自定义 QAbstractItemModel。

​​需要复杂的树状结构。​​ QStringListModel只支持扁平列表。

​​需要非常复杂的自定义行为:​​ 虽然可以通过继承重写,但如果需求复杂,可能直接继承 QAbstractListModel或 QAbstractItemModel更清晰。

本次分享就到这里了,如果有什么错误的话请指正,或者有什么疑问的,也可以在评论区一起探讨!


文章转载自:

http://0n0ThG5N.gtwtk.cn
http://DijDsFZJ.gtwtk.cn
http://ccIqGLok.gtwtk.cn
http://0pozzEev.gtwtk.cn
http://ucqUOV61.gtwtk.cn
http://OpIvBYCX.gtwtk.cn
http://B6WMxUNf.gtwtk.cn
http://MYZTx9iW.gtwtk.cn
http://YL3n6Sa3.gtwtk.cn
http://LgMLlSpB.gtwtk.cn
http://fAaOpi94.gtwtk.cn
http://W6qVUFTG.gtwtk.cn
http://A0tdvsum.gtwtk.cn
http://IhHCpQ1Z.gtwtk.cn
http://lvKGkYbo.gtwtk.cn
http://xLy8y1at.gtwtk.cn
http://3LdqV8dt.gtwtk.cn
http://qs9IOZNt.gtwtk.cn
http://uUJru8py.gtwtk.cn
http://xSvQ8KPe.gtwtk.cn
http://yo0Ipztr.gtwtk.cn
http://K6dUPYPk.gtwtk.cn
http://8xhW8Ie7.gtwtk.cn
http://B0t4uvza.gtwtk.cn
http://N5LtUWhB.gtwtk.cn
http://rn8wBDuN.gtwtk.cn
http://85ky4Ouo.gtwtk.cn
http://bDTcvSQK.gtwtk.cn
http://o5NO1AFd.gtwtk.cn
http://19QCKYEp.gtwtk.cn
http://www.dtcms.com/a/380271.html

相关文章:

  • 【数据结构】Java集合框架:List与ArrayList
  • 开发避坑指南(48):Java Stream 判断List元素的属性是否包含指定的值
  • postgresql 数据库备份、重新构建容器
  • 大数据电商流量分析项目实战:Spark SQL 基础(四)
  • vmware ubuntu18设置共享文件夹的几个重要点
  • 每日一题(5)
  • Lumerical licence center 无法连接的问题
  • Java网络编程(2):(socket API编程:UDP协议的 socket API -- 回显程序)
  • Java 类加载机制双亲委派与自定义类加载器
  • OpenLayers数据源集成 -- 章节九:必应地图集成详解
  • 前端调试工具有哪些?常用前端调试工具推荐、前端调试工具对比与最佳实践
  • 【C++练习】16.C++将一个十进制转换为二进制
  • 公司本地服务器上搭建部署的办公系统web项目网站,怎么让外网访问?有无公网IP下的2种通用方法教程
  • 【C++】string类 模拟实现
  • 【系列文章】Linux中的并发与竞争[02]-原子操作
  • 微信小程序 -开发邮箱注册验证功能
  • 使用ollama启动文心开源大模型0.3b版本
  • 【langchain】构建检索问答链
  • QT M/V架构开发实战:QSqlQueryModel/ QSqlTableModel/ QSqlRelationalTableModel介绍
  • 网络编程入门:构建你的第一个客户端-服务器应用
  • 极简灰度发布实现新老风控系统切流
  • 基于跳跃表的zset实现解析(lua版)
  • 【学习K230-例程18】GT6700-HTTP-Server
  • Redis列表(List):实现队列/栈的利器,底层原理与实战
  • 超级流水线和标量流水线的原理
  • 漫谈《数字图像处理》之边缘检测与边界预处理的辨析
  • (二)文件管理-文件查看-less命令的使用
  • 深入理解节流(Throttle):原理、实现与应用场景
  • 汽车电子电气架构中的电源架构(下)
  • GISBox与GeoServer使用体验全对比:轻量化工具如何重新定义GIS价值?