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

### 目录

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

cpp 复制代码
// 创建一个空模型
QStringListModel *model = new QStringListModel(parent);

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

2.基本属性与方法

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

cpp 复制代码
// 设置整个字符串列表 (会重置模型)
QStringList fruits;
fruits << "Apple" << "Banana" << "Cherry";
model->setStringList(fruits);

// 获取模型当前持有的整个字符串列表
QStringList currentList = model->stringList();

2)获取行数

cpp 复制代码
int count = model->rowCount(); // 等同于 model->stringList().size()

3)获取数据 (data())

cpp 复制代码
// 获取指定行 (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())

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

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

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

6)​插入行 (insertRows())

cpp 复制代码
// 在 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())

cpp 复制代码
// 删除从 row 开始的 count 行
model->removeRows(row, count);

8)​追加行

cpp 复制代码
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())

cpp 复制代码
// 升序排序 (默认)
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)​​与视图连接

cpp 复制代码
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更清晰。

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

相关推荐
人工干智能3 小时前
科普:Python 中,字典的“动态创建键”特性
开发语言·python
初听于你4 小时前
缓存技术揭秘
java·运维·服务器·开发语言·spring·缓存
长路归期无望6 小时前
C语言小白实现多功能计算器的艰难历程
c语言·开发语言·数据结构·笔记·学习·算法
恒悦sunsite6 小时前
Ubuntu之apt安装ClickHouse数据库
数据库·clickhouse·ubuntu·列式存储·8123
是大强6 小时前
stm32摇杆adc数据分析
开发语言
奥尔特星云大使6 小时前
MySQL 慢查询日志slow query log
android·数据库·mysql·adb·慢日志·slow query log
来自宇宙的曹先生6 小时前
MySQL 存储引擎 API
数据库·mysql
间彧6 小时前
MySQL Performance Schema详解与实战应用
数据库
间彧7 小时前
MySQL Exporter采集的关键指标有哪些,如何解读这些指标?
数据库
weixin_446260857 小时前
Django - 让开发变得简单高效的Web框架
前端·数据库·django