QT------模型/视图
一、模型/视图结构概述
- 基本原理:
- Qt 的模型/视图(Model/View)架构将数据的存储和显示分离,提高了代码的可维护性和复用性。
- 模型(Model):负责存储和管理数据,提供数据的访问接口,如获取数据、插入数据、修改数据、删除数据等。
- 视图(View):负责显示数据,不关心数据的存储和操作,只根据模型的数据进行显示。
- 代理(Delegate):负责在视图中渲染和编辑数据项,提供了一种机制来定制数据的显示和编辑方式,例如使用自定义的部件进行数据的编辑。
二、QAbstractItemModel 类
- 功能:
- 是所有项模型的抽象基类,定义了项模型必须实现的接口,如
rowCount
、columnCount
、data
、setData
等,用于提供数据的存储和操作接口。 - 可以自定义继承自
QAbstractItemModel
的模型类,以满足不同的数据存储和操作需求。
- 是所有项模型的抽象基类,定义了项模型必须实现的接口,如
三、QAbstractItemView 类
- 功能:
- 是所有项视图的抽象基类,提供了显示数据的通用接口,如
setModel
用于关联一个模型,视图会根据模型的数据进行显示和更新。 - 常见的派生类有
QListView
、QTreeView
、QTableView
等,分别用于列表、树状、表格形式的数据显示。
- 是所有项视图的抽象基类,提供了显示数据的通用接口,如
四、QStringListModel 类及示例程序功能实现
- 功能:
- 存储一个字符串列表,方便地用于
QListView
和QComboBox
等视图的数据显示。
- 存储一个字符串列表,方便地用于
#include <QApplication>
#include <QListView>
#include <QStringListModel>int main(int argc, char *argv[])
{QApplication app(argc, argv);QStringListModel *model = new QStringListModel;QStringList stringList;stringList << "Item 1" << "Item 2" << "Item 3";model->setStringList(stringList);QListView *listView = new QListView;listView->setModel(model);listView->show();return app.exec();
}
- 代码解释:
- 创建一个
QStringListModel
并添加一些字符串元素。 - 创建一个
QListView
并将QStringListModel
设置为其模型,QListView
将显示字符串列表中的元素。
- 创建一个
五、自定义代理
- 自定义代理功能:
- 允许用户自定义数据在视图中的显示和编辑方式,例如使用自定义的部件进行数据的编辑,或者添加一些特定的显示效果。
- 允许用户自定义数据在视图中的显示和编辑方式,例如使用自定义的部件进行数据的编辑,或者添加一些特定的显示效果。
六、QStyledItemDelegate 类及设计自定义代理类
- 功能:
- 提供了默认的数据项显示和编辑功能,可作为自定义代理的基类。
#include <QApplication>
#include <QListView>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QStyleOptionViewItem>class CustomDelegate : public QStyledItemDelegate
{
protected:void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override{QStyleOptionViewItem opt = option;initStyleOption(&opt, index);// 自定义绘制painter->save();painter->setPen(Qt::red);painter->drawText(opt.rect, Qt::AlignCenter, index.data().toString());painter->restore();}QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override{// 创建自定义编辑器QLineEdit *editor = new QLineEdit(parent);return editor;}void setEditorData(QWidget *editor, const QModelIndex &index) const override{QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);if (lineEdit) {lineEdit->setText(index.data().toString());}}void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override{QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);if (lineEdit) {model->setData(index, lineEdit->text());}}void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override{editor->setGeometry(option.rect);}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);QStringListModel *model = new QStringListModel;QStringList stringList;stringList << "Item 1" << "Item 2" << "Item 3";model->setStringList(stringList);QListView *listView = new QListView;listView->setModel(model);CustomDelegate *delegate = new CustomDelegate;listView->setItemDelegate(delegate);listView->show();return app.exec();
}
- 代码解释:
- 自定义
CustomDelegate
类,继承自QStyledItemDelegate
。 paint
方法用于自定义数据项的绘制,这里将文本绘制为红色。createEditor
方法创建自定义的编辑部件(这里是QLineEdit
)。setEditorData
方法将模型数据设置到编辑器中。setModelData
方法将编辑器的数据更新到模型中。updateEditorGeometry
方法设置编辑器的位置和大小。
- 自定义
七、QFileSystemModel 和 QTreeView 类及示例程序功能实现
- 功能:
QFileSystemModel
提供了文件系统的数据模型,可以显示文件和目录。QTreeView
可以用来显示QFileSystemModel
提供的数据。
#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>int main(int argc, char *argv[])
{QApplication app(argc, argv);QFileSystemModel *model = new QFileSystemModel;model->setRootPath(QDir::homePath());QTreeView *treeView = new QTreeView;treeView->setModel(model);treeView->setRootIndex(model->index(QDir::homePath()));treeView->show();return app.exec();
}
- 代码解释:
- 创建
QFileSystemModel
并设置根路径为用户的主目录。 - 创建
QTreeView
并将QFileSystemModel
设置为其模型。 - 将
QTreeView
的根索引设置为用户主目录,使其显示用户主目录下的文件和目录结构。
- 创建
相关文章:

QT------模型/视图
一、模型/视图结构概述 基本原理: Qt 的模型/视图(Model/View)架构将数据的存储和显示分离,提高了代码的可维护性和复用性。模型(Model):负责存储和管理数据,提供数据的访问接口&am…...
Git - 记录一次由于少输入了一个命令导致的更改丢失
Git - 记录一次由于少输入了一个参数导致的更改丢失 前言 某晚我激情开发了几个小时,中途没有进行commit存档。准备睡觉时,我想创建一个新的分支并将今晚所有更改提交到新分支上(似乎应该开发时候就创建?)。 然后因…...
nodeJS下npm和yarn的关系和区别详解
一、命令对应关系 1. 初始化项目 操作npm 命令Yarn 命令初始化项目npm inityarn init跳过提问快速初始化npm init -yyarn init -y 2. 安装依赖 操作npm 命令Yarn 命令安装项目所有依赖npm installyarn install添加依赖npm install <package-name>yarn add <package…...

党员学习交流平台
本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…...
HTML5 文件上传(File Upload)详解
HTML5 文件上传(File Upload)详解 HTML5 提供了强大的文件上传功能,允许用户通过网页选择文件并上传到服务器。以下是关于文件上传控件的详细说明。 1. 基本的文件上传控件 使用 <input> 标签的 type"file" 属性可以创建一…...

1.2.1-2部分数据结构的说明02_链表
(1)链表数据结构: 概念: 将列表中相互连接的节点不连续的存储在内存中。与数据不同,我们无法再恒定时间内访问任何元组,如果遍历所有则花费时间与元素总数n成正比。插入和删除1个元素的时间复杂度都是O(n…...

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。
vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。 1.设计思路:2.设计细节3.详细代码实现 1.设计思路: 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…...

linux上使用cmake编译的方法
一、hello 例程仅基于一个cpp文件 C文件或工程进行编译时可以使用g指令(需要对每一个程序和源文件分别使用g指令编译),当程序变大时,一个工程文件往往会包含很文件夹和源文件,这时我们需要的编译指令将越来越长&#…...

如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢?
如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢? 要实现的效果图选择部分品牌但不选选项效果问题概述实现方案el-select组件与el-checkbox组件无缝衔接给form表单加自定义校验规则 要实现的效果图 选择部分品牌但不选选项效果 问题概述 相信大家看到…...
源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats
官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/API/Runtime/Core/ProfilingDebugging/FCookStatsManager文档中的注释: When a cook a complete that is configured to use stats (ENABLE_COOK_STATS), it will broadcast this…...
Android 根据内存大小显示MTP模式连接PC时的名称
项目有两种内存,要求根据连接电脑拷贝文件时的盘符名称根据内存大小显示不同名称。 frameworks/base/media/java/android/mtp/MtpDatabase.java//mh import android.app.ActivityManager; ...-894,7 896,19 public class MtpDatabase implements AutoCloseable {p…...
不只是mini-react第一节:实现最简单mini-react
项目总结构: ├─ 📁core │ ├─ 📄React.js │ └─ 📄ReactDom.js ├─ 📁node_modules ├─ 📁tests │ └─ 📄createElement.spec.js ├─ 📄App.js ├─ 📄in…...

前端路由layout布局处理以及菜单交互(三)
上篇介绍了前端项目部署以及基本依赖的应用,这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…...
小结:DNS,HTTP,SMTP,IMAP,FTP,Telnet,TCP,ARP,ICMP
DNS(Domain Name System,域名系统) 是互联网的重要组成部分,它负责将人类易读的域名(如 www.google.com)转换为机器可以识别的 IP 地址(如 142.250.72.206)。这一过程被称为域名解析…...

【C++】P2550 [AHOI2001] 彩票摇奖
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式:输入输出样例: 💯题解思路1. 问题解析 💯我的实现实现逻辑问题分析 💯老…...

并发服务器框架——zinx
zinx框架 Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架,它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能,包括但不限于连接管理、数据编解码、业务处理、负载均衡等,适用于构建各种 TCP 网络服务,如游戏…...

Unity 中计算射线和平面相交距离的原理
有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积,如果大于等于0,则说明射线和平面没有相交,否则,说明射线和平面相交…...
浅谈棋牌游戏开发流程七:反外挂与安全体系——守护游戏公平与玩家体验
一、前言:为什么反外挂与安全这么重要? 对于任何一款线上棋牌游戏而言,公平性和玩家安全都是最重要的核心要素之一。如果游戏环境充斥着各式各样的外挂、作弊方式,不仅会毁坏玩家体验,更会导致游戏生态崩塌、口碑下滑…...

《无力逃脱》V1.0.15.920(59069)官方中文版
艾丹是一名三臂赏金猎人,他必须追捕银河系中最危险、最难以捉摸的割喉者。 有些悬赏是金钱,有些则是有价值的信息。艾丹可以利用这些信息找到让他走上这条路的人,同时也会卷入一个全银河系的阴谋中。 拥有三条手臂可以让你同时对付更多的敌…...
六种主流服务器的选择与使用
网络的运行离不开各种服务器,它们各司其职,为我们提供稳定的网络服务。本文带大家了解6种常见服务器类型。 服务器的六大种类 第一种:Web服务器 Web服务器是互联网的核心。当你打开一个网站,比如百度或淘宝,浏览器会…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...