QtC++与QColumnView详解
介绍
在 Qt 中,QColumnView 是用于显示多列数据的控件,它提供了一种多列列表视图的方式,类似于文件资源管理器中的详细视图。QColumnView 是基于模型/视图架构的,通常与 QFileSystemModel 或自定义模型一起使用。
以下是关于 QColumnView 的详细讲解:
QColumnView 的作用:
-
多列显示:
QColumnView允许你在一个视图中同时显示多列数据,每一列可以使用不同的数据模型,以更灵活地组织和展示信息。 -
模型/视图架构: 基于 Qt 的模型/视图架构,可以使用不同的数据模型来提供数据,例如
QStandardItemModel、QFileSystemModel或自定义的模型。 -
树形结构: 支持显示树形结构的数据,每一列都可以表示树的一个层级,使得显示层次化数据非常方便。
-
定制化视图: 允许通过委托 (
QAbstractItemDelegate) 定制每一列的外观和交互效果,以满足特定的显示需求。 -
多列选择: 提供了多列选择的功能,用户可以选择一列或多列数据进行操作。
-
数据筛选: 支持通过过滤器对数据进行筛选,以显示特定条件下的数据。
QColumnView 常用方法和信号:
以下是一些常用的方法和信号,可用于控制和响应 QColumnView 的行为:
-
setModel(QAbstractItemModel *model): 设置与QColumnView关联的数据模型。 -
setSelectionModel(QItemSelectionModel *selectionModel): 设置选择模型,控制选择的行为。 -
setColumnWidths(const QList<int> &list): 设置每一列的宽度,通过传递一个QList包含每一列的宽度值。 -
setCurrentIndex(const QModelIndex &index): 设置当前选择的索引,用于定位显示的数据。 -
resizeColumnToContents(int column): 调整指定列的宽度以适应内容。 -
setRootIndex(const QModelIndex &index): 设置根索引,用于显示指定的树形结构。 -
clicked(const QModelIndex &index): 单击某个单元格时触发的信号。 -
doubleClicked(const QModelIndex &index): 双击某个单元格时触发的信号。
示例应用场景:
-
文件资源管理器:
QColumnView可以用于实现类似 Windows 资源管理器的文件浏览功能,每一列代表一个文件夹,展示文件夹内的内容。 -
项目管理工具: 在项目管理工具中,
QColumnView可以用于按照不同的项目属性组织和显示项目信息。 -
图形化配置界面: 用于创建图形化配置界面,用户可以通过多列选择方式配置软件参数和选项。
-
树形数据的展示:
QColumnView适用于展示树形数据,每一列代表树的一个层级。 -
多列数据的比对: 在需要比对多列数据的场景中,
QColumnView提供了一种直观的方式。
注意事项:
-
使用
QColumnView时,通常需要一个合适的数据模型,例如QStandardItemModel、QFileSystemModel或者自定义的模型类。 -
对于复杂的单元格外观和交互需求,可以通过自定义委托或者子类化
QColumnView来实现。 -
当列数较多或数据量较大时,注意性能问题,可以考虑使用虚拟滚动等技术进行优化。
结论:
QColumnView 提供了一种方便的方式来显示多列数据,适用于需要同时展示多个层级结构或树形结构的场景。通过灵活使用模型/视图架构和定制化视图的功能,开发者可以轻松实现各种多列数据的显示需求。
示例
```cpp
#include <QApplication>
#include <QColumnView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QFileSystemModel>
#include <QDebug>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 示例1: 创建简单的 QColumnViewQColumnView simpleColumnView;QStandardItemModel simpleModel;// 添加数据QList<QStandardItem*> rootItems;rootItems << new QStandardItem("Category 1") << new QStandardItem("Category 2") << new QStandardItem("Category 3");simpleModel.appendColumn(rootItems);QList<QStandardItem*> category1Items;category1Items << new QStandardItem("Item 1.1") << new QStandardItem("Item 1.2") << new QStandardItem("Item 1.3");rootItems[0]->appendColumn(category1Items);QList<QStandardItem*> category2Items;category2Items << new QStandardItem("Item 2.1") << new QStandardItem("Item 2.2") << new QStandardItem("Item 2.3");rootItems[1]->appendColumn(category2Items);QList<QStandardItem*> category3Items;category3Items << new QStandardItem("Item 3.1") << new QStandardItem("Item 3.2") << new QStandardItem("Item 3.3");rootItems[2]->appendColumn(category3Items);simpleColumnView.setModel(&simpleModel);simpleColumnView.show();// 示例2: 使用 QFileSystemModel 显示文件系统QColumnView fileSystemColumnView;QFileSystemModel fileSystemModel;fileSystemModel.setRootPath(QDir::rootPath());fileSystemColumnView.setModel(&fileSystemModel);fileSystemColumnView.show();// 示例3: 自定义数据模型QColumnView customModelColumnView;QStandardItemModel customModel;QList<QStandardItem*> customRootItems;customRootItems << new QStandardItem("Custom Category 1") << new QStandardItem("Custom Category 2");customModel.appendColumn(customRootItems);QList<QStandardItem*> customCategory1Items;customCategory1Items << new QStandardItem("Custom Item 1.1") << new QStandardItem("Custom Item 1.2");customRootItems[0]->appendColumn(customCategory1Items);QList<QStandardItem*> customCategory2Items;customCategory2Items << new QStandardItem("Custom Item 2.1") << new QStandardItem("Custom Item 2.2");customRootItems[1]->appendColumn(customCategory2Items);customModelColumnView.setModel(&customModel);customModelColumnView.show();// 示例4: 自定义委托定制外观和交互QColumnView customDelegateColumnView;QStandardItemModel delegateModel;QList<QStandardItem*> delegateRootItems;delegateRootItems << new QStandardItem("Delegate Category 1") << new QStandardItem("Delegate Category 2");delegateModel.appendColumn(delegateRootItems);QList<QStandardItem*> delegateCategory1Items;delegateCategory1Items << new QStandardItem("Delegate Item 1.1") << new QStandardItem("Delegate Item 1.2");delegateRootItems[0]->appendColumn(delegateCategory1Items);QList<QStandardItem*> delegateCategory2Items;delegateCategory2Items << new QStandardItem("Delegate Item 2.1") << new QStandardItem("Delegate Item 2.2");delegateRootItems[1]->appendColumn(delegateCategory2Items);// 自定义委托,用于设置特定列的外观和交互class CustomDelegate : public QAbstractItemDelegate {public:QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override {Q_UNUSED(option);if (index.column() == 0) {QLineEdit *editor = new QLineEdit(parent);return editor;}return nullptr;}void setEditorData(QWidget *editor, const QModelIndex &index) const override {if (index.column() == 0) {QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);if (lineEdit) {lineEdit->setText(index.data(Qt::DisplayRole).toString());}}}void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override {if (index.column() == 0) {QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);if (lineEdit) {model->setData(index, lineEdit->text(), Qt::EditRole);}}}void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override {Q_UNUSED(index);editor->setGeometry(option.rect);}};customDelegateColumnView.setItemDelegate(new CustomDelegate);customDelegateColumnView.setModel(&delegateModel);customDelegateColumnView.show();return app.exec();
}
相关文章:
QtC++与QColumnView详解
介绍 在 Qt 中,QColumnView 是用于显示多列数据的控件,它提供了一种多列列表视图的方式,类似于文件资源管理器中的详细视图。QColumnView 是基于模型/视图架构的,通常与 QFileSystemModel 或自定义模型一起使用。 以下是关于 QC…...
微信小程序配置企业微信的在线客服
配置企业微信后台 代码实现 <button tap"openCustomerServiceChat">打开企业微信客服</button>methods: {openCustomerServiceChat(){wx.openCustomerServiceChat({extInfo: {url: 你刚才的客服地址},corpId: 企业微信的id,showMessageCard: true,});} …...
深入理解Java AQS:从原理到源码分析
目录 AQS的设计原理1、队列节点 Node 和 FIFO队列结构2、state 的作用3、公平锁与非公平锁 AQS 源码解析1、Node节点2、acquire(int)3、release(int)4、自旋(Spin)5、公平性与 FIFO 基于AQS实现的几种同步器1、ReentrantLock:可重入独占锁2、…...
【数据结构(四)】栈(1)
文章目录 1. 关于栈的一个实际应用2. 栈的介绍3. 栈的应用场景4. 栈的简单应用4.1. 思路分析4.2. 代码实现 5. 栈的进阶应用(实现综合计算器)5.1. 栈实现一位数计算(中缀表达式)5.1.1. 思路分析5.1.2. 代码实现 5.2. 栈实现多位数计算(中缀表达式)5.2.1. 解决思路5.2.2. 代码实…...
实验(四):指令部件实验
一、实验内容与目的 实验要求: 利用CP226实验仪上的小键盘将程序输入主存储器EM,通过指令的执行实现微程序控制器的程序控制。 实验目的: 1.掌握模型机的操作码测试过程; 2.掌握模型机微程序控制器的基本结构以及程序控制的基本原…...
【Android11】在内置的Tvsettings的界面中显示以太网Mac地址
【Android11】在内置的Tvsettings的界面中显示以太网Mac地址 了解Preference必要信息步骤:1. 在设置页面的xml文件中增加一个Preference ,这是要显示出来的设置项2. 在strings.xml文件中增加我们在第一步新设置的值3. 为新加的设置项增加一个新的XXXPref…...
在Oracle 11g 数据库上设置透明数据加密(TDE)
本文回答2个问题: 11g下简明的TDE设置过程由于11g不支持在线TDE,介绍2中11g下的加密表空间的迁移方法 设置表空间TDE之前 表空间没有加密时,很容易探测到明文数据: create tablespace unsectbs datafile unsectbs.dbf size 10…...
互动直播 之 视频帧原始数据管理
目录 一、视频帧管理 1、存储图片数据的数据结构 1.1)、图片数据首地址...
基于tcp协议及数据库sqlite3的云词典项目
这个小项目是一个网络编程学习过程中一个阶段性检测项目,过程中可以有效检测我们对于服务器客户端搭建的能力,以及一些bug查找能力。项目的一个简单讲解我发在了b站上,没啥心得,多练就好。 https://t.bilibili.com/86524470252640…...
C/C++内存管理(1):C/C++内存分布,C++内存管理方式
一、C/C内存分布 1.1 1.2 二、C内存管理方式 C可以通过操作符new和delete进行动态内存管理。 2.1 new和delete操作内置类型 int main() {int* p1 new int;// 注意区分p2和p3int* p2 new int(10);// 对*p2进行初始化 10int* p3 new int[10];// p3 指向一块40个字节的int类…...
11 redis中分布式锁的实现
单机锁代码 import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.con…...
循环链表3
插入函数——插入数据,在链表plsit的pos位置插入val数据元素 位置pos(在无特别说明的情况下)是从0开始计数的 要改变链表结构,就要依赖前驱,每个前驱的next存储着下一个数据结点的地址,也就是依靠前驱的ne…...
如何修改百科内容?百度百科内容怎么修改?
百科词条创建上去是相当不易的,同时修改也是如此,一般情况下,百科词条是不需要修改的,但是很多时候企业或是人物在近期收获了更多成就或是有更多的变动,这个时候就需要补充维护词条了,如何修改百科内容&…...
mysql8.0英文OCP考试第131-140题
Q131.You have upgraded the MySQL binaries from 5.7.28 to 8.0.18 by using an in-place upgrade. Examine the message sequence generated during the first start of MySQL 8.0.18: 。。。[System]。。。/usx/sbin/mysqld (mysqld 8.0.18-commercial) starting as proces…...
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
目录 介绍 案例 通过SQLSTATE指定具体的状态码 通过SQLSTATE的代码简写方式 NOT FOUND 介绍 条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为: DECLARE handler_action HANDLER FOR c…...
信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,cpu寄存器),信号的处理流程详细介绍+抽象图解
目录 信号的处理时机 引入 思考 -- 什么时候才能算合适的时候呢? 用户态转为内核态 引入 内核地址空间 引入 思考 -- 进程为什么能切换成内核态呢? 虚拟地址空间 注意点 原理 (总结一下) 为什么如何进入内核态 引入 介绍 底层原理(int 80) cpu的寄存器 用…...
【JavaEE】Spring的创建和使用(保姆级手把手图解)
一、创建一个Spring项目 1.1 创建一个Maven项目 1.2 添加 Spring 框架支持 在pom.xml中添加 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE&…...
MyBatis:关联查询
MyBatis 前言关联查询附懒加载对象为集合时的关联查询 前言 在 MyBatis:配置文件 文章中,最后介绍了可以使用 select 标签的 resultMap 属性实现关联查询,下面简单示例 关联查询 首先,先创建 association_role 和 association_…...
第十二章 控制值的转换
文章目录 第十二章 控制值的转换介绍处理特殊 XML 字符文字和 SOAP 编码格式的转义形式 示例防止泄漏的另一种方法 第十二章 控制值的转换 类和属性参数 ESCAPE CONTENT XMLTIMEZONE DISPLAYLIST VALUELIST XMLDEFAULTVALUE XMLLISTPARAMETER XMLSTREAMMODE 介绍 支…...
SQL并集、交集、差集使用
一、概述 SQL语句实现数据的并集(union)、交集(intersect)、差集(except)。 二、案例 1、stu表 idname1张三2李四3王二 2、并集 union union 运算:表示取并集,例如:…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
