【Qt之模型视图】5. Qt库提供的视图便捷类

1. 前言

Qt提供了一些便捷的视图类,如QListWidget提供项目列表,QTreeWidget显示多级树结构,QTableWidget提供单元格项的表格。每个类都继承了QAbstractItemView类的行为,QAbstractItemView类实现了项目选择和标题管理的通用行为。
这三个类使用起来方便,但适合于少量数据的存储与显示(存储个几万、十几万的数据还可以),因为它们三个没有将视图和模型进行分离,因此没有视图类灵活。
而且这三个类也不能和模型一起使用。
类关系图如下:
image.png

2. QListWidget使用

QListWidget是一个单级列表,通常使用QListWidget和一些QListWidgetItem进行显示。它可以用来显示一列项目,每个项目可以包含文本、图标或其他自定义的小部件。
使用QListWidget,可以添加和删除项目,设置项目的属性,处理项目的选择和双击事件等。
要使用QListWidget,需要创建一个QListWidget对象,并使用addItem()方法添加项目。每个项目都是一个QListWidgetItem对象,可以设置其文本、图标、工具提示等属性。
还可以使用setSelectionMode()方法设置选择模式,包括单选、多选和扩展选择等。
除了基本的列表功能,QListWidget还提供了一些便捷的方法,如排序、搜索和过滤项目等。
如:

    // 添加项目到列表中QStringList items;items << "Item 1" << "Item 4" << "Item 2" << "Item 3";foreach(QString item, items) {QListWidgetItem *listItem = new QListWidgetItem(item);listItem->setWhatsThis(listItem->text());listItem->setToolTip(listItem->text());listItem->setStatusTip(listItem->text());listItem->setBackgroundColor(QColor(qrand()%255, qrand()%255, qrand()%255));ui->listWidget->addItem(listItem);}// 设置选择模式为多选ui->listWidget->setSelectionMode(QListWidget::MultiSelection);// 排序列表ui->listWidget->sortItems();

image.png

3. QTreeWidget使用

QTreeWidget是一种用于显示树形结构数据的控件,它基于QTreeView控件,并且提供了更高级的功能。
QTreeWidget可以以树的形式展示一组项目,每个项目可以包含一个或多个子项目。
QTreeWidget中的每个项目都可以包含多列数据,每列数据对应一个QTreeWidgetItem。

QTreeWidget的特点包括:

  1. 支持多列数据:每个项目可以包含多列数据,每列数据可以是不同类型的数据,例如文本、图像等。
  2. 可以设置项目的图标:QTreeWidgetItem可以设置一个图标,用于表示项目的状态或类型。
  3. 支持拖放操作:QTreeWidget可以在项目之间支持拖放操作,实现项目的移动或复制。
  4. 支持排序:QTreeWidget可以通过调用sortItems()函数进行项目的排序,可以根据指定的列进行排序。
  5. 支持编辑:QTreeWidget可以启用项目的编辑功能,允许用户直接在QTreeWidget中编辑项目的数据。
  6. 信号槽机制:QTreeWidget提供了多个信号,可以在项目被选中、编辑完成等事件发生时进行相应的处理。

使用QTreeWidget需要先创建一个QTreeWidget对象,并设置其父窗口或布局。然后通过调用QTreeWidget的各种方法,创建项目、设置项目数据、设置项目图标等。可以使用QTreeWidgetItem的addChild()方法来添加子项目。最后,将QTreeWidget添加到父窗口或布局中即可显示。

QTreeWidget可以通过信号和槽机制来响应用户的操作或处理特定事件。例如,当用户点击一个项目时,QTreeWidget会发出itemClicked()信号,可以连接槽函数来处理该信号并执行相应的操作。
如:

    // 创建QTreeWidget对象ui->treeWidget->setColumnCount(2); // 设置列数为2// 创建根节点QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->treeWidget);rootItem->setText(0, "Root");// 添加子节点QTreeWidgetItem *childItem1 = new QTreeWidgetItem(rootItem);childItem1->setText(0, "Child 1");childItem1->setText(1, "Data 1");QTreeWidgetItem *childItem2 = new QTreeWidgetItem(rootItem);childItem2->setText(0, "Child 2");childItem2->setText(1, "Data 2");// 添加根节点的子节点QTreeWidgetItem *subChildItem = new QTreeWidgetItem(childItem1);subChildItem->setText(0, "Sub Child");subChildItem->setText(1, "Sub Data");// 设置根节点的图标rootItem->setIcon(0, QIcon(":/icons/root.png"));// 设置子节点的图标childItem1->setIcon(0, QIcon(":/icons/child.png"));childItem2->setIcon(0, QIcon(":/icons/child.png"));subChildItem->setIcon(0, QIcon(":/icons/subchild.png"));

image.png
QTreeWidget控件对于顶层项和非顶层项处理的方式不同。如移除项,如果是顶层项,则用takeTopLevelItem()方法进行移除;如果非顶层项,则要使用其移除项的父项中的takeChild()方法进行移除。插入也是一样,插入顶层项,使用insertTopLevelItem()方法;如果插入非顶层项,则用其插入项的父项中的insertChild()方法进行插入。
如,删除 :

      QTreeWidgetItem *parent = currentItem->parent();int index;if (parent) {index = parent->indexOfChild(treeWidget->currentItem());delete parent->takeChild(index);} else {index = treeWidget->indexOfTopLevelItem(treeWidget->currentItem());delete treeWidget->takeTopLevelItem(index);}

插入:

      QTreeWidgetItem *parent = currentItem->parent();QTreeWidgetItem *newItem;if (parent)newItem = new QTreeWidgetItem(parent, treeWidget->currentItem());elsenewItem = new QTreeWidgetItem(treeWidget, treeWidget->currentItem());

4. QTableWidget使用

QTableWidget是一个用于显示表格数据的小部件。它承自QTableView,并且提供了额外的功能,比如直接编辑单元格和插入/删除行和列。

其主要特性和使用方法如下:

  1. 表格结构:QTableWidget以行和列的形式组织数据,并可以动态添加或删除行和列。使用setRowCount()和setColumnCount()可以设置表格的行数和列数。

  2. 单元格内容:使用setItem()方法可以将一个QTableWidgetItem对象插入到特定的单元格中,以设置单元格的内容。可以使用QTableWidgetItem的setText()方法设置文本内容,或使用其他数据类型(如图标、颜色等)设置单元格的其他属性。

  3. 单元格编辑:可以在QTableWidget中直接编辑单元格的内容。可以通过设置setEditTriggers()方法来控制哪些单元格可以编辑,例如QAbstractItemView::NoEditTriggers表示所有单元格都不可编辑,而QAbstractItemView::CurrentChanged表示只有当前选中的单元格可编辑。

  4. 表头:QTableWidget可以显示表格的水平和垂直表头,分别对应于列和行。可以使用setHorizontalHeaderLabels()和setVerticalHeaderLabels()方法设置表头的文本。

  5. 选择:可以通过设置setSelectionMode()方法来设置选择模式。例如,选择模式可以是单行、多行、单列或多个单元格。还可以通过设置setSelectionBehavior()方法来控制选择行为,例如选择一整行或一整列。

  6. 排序和排序指示符:QTableWidget支持对表格数据进行排序,并在表头显示排序指示符。可以使用QTableWidget的sortItems()方法对指定列的数据进行排序,也可以通过setSortingEnabled()方法在表格上启用或禁用排序功能。

  7. 单元格合并:可以通过使用setSpan()方法将多个相邻的单元格合并成一个单元格。这在需要合并单元格的情况下提供了更灵活的布局选项。

  8. 数据导入和导出:QTableWidget提供了一些方法来导入和导出表格数据。可以使用setItem()方法将数据从一个模型或其他数据源导入到表格中,并使用item()方法从表格中获取数据。
    如:

    // 设置表格的行数和列数ui->tableWidget->setRowCount(5);ui->tableWidget->setColumnCount(3);// 设置选择行为和选择模式ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);// 设置表头ui->tableWidget->setHorizontalHeaderLabels({"列1", "列2", "列3"});// 向单元格中插入数据ui->tableWidget->setItem(0, 0, new QTableWidgetItem("数据1"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("数据2"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("数据3"));// 在第2行插入一行数据ui->tableWidget->insertRow(1);ui->tableWidget->setItem(1, 0, new QTableWidgetItem("数据4"));ui->tableWidget->setItem(1, 1, new QTableWidgetItem("数据5"));ui->tableWidget->setItem(1, 2, new QTableWidgetItem("数据6"));for(int i = 0; i < 4; ++i){for(int j = 0; j < 3; ++j){ui->tableWidget->setItem(i+2, j, new QTableWidgetItem(QString("%1_%2").arg(i+2).arg(j)));}}// 遍历表格中的所有单元格,并打印它们的内容for (int row = 0; row < ui->tableWidget->rowCount(); ++row){for (int column = 0; column < ui->tableWidget->columnCount(); ++column){QTableWidgetItem *item = ui->tableWidget->item(row, column);//qDebug() << "(" << row << "," << column << "):" << item->text();}}// 隐藏第一列// ui->tableWidget->setColumnHidden(0, true);

image.png

5. 特性

每个类都有许多基于项的公共特性,这些特性可以通过每个类中的相同接口获得。

5.1 隐藏

有时,在项目视图小部件中隐藏项目而不是删除项目是很有用的。所有上述小部件的项都可以隐藏,稍后再显示。可以通过调用isHidden()函数来确定是否隐藏项,并且可以使用setHidden()来隐藏项。
由于此操作是基于项的,因此可用于以上三个类。

5.2 选择

选择项目的方式由小部件的选择模式控制(QAbstractItemView::SelectionMode)。此属性控制用户是否可以选择一个或多个项目,以及在多项目选择中,选择是否必须是一个连续的项目范围。选择模式对上述所有小部件都以相同的方式工作。
image.png
如,使用selectedItems()函数读取小部件中选定的项,并提供可迭代的相关项列表:

      QList<QTableWidgetItem *> selected = tableWidget->selectedItems();QTableWidgetItem *item;int number = 0;double total = 0;foreach (item, selected) {bool ok;double value = item->text().toDouble(&ok);if (ok && !item->text().isEmpty()) {total += value;number++;}}

5.3 查找

能够在项目视图小部件中查找项通常很有用,无论是作为开发人员还是作为服务提供给用户。以上类都提供了一个通用的findItems()函数,以使其尽可能一致和简单。
根据Qt::MatchFlags中的一组值所指定的标准,搜索条目所包含的文本。可以使用findItems()函数获取匹配项的列表:

      QTreeWidgetItem *item;QList<QTreeWidgetItem *> found = treeWidget->findItems(itemText, Qt::MatchWildcard);foreach (item, found) {treeWidget->setItemSelected(item, true);// to do Something}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16.5 参考文献——深度学习定位

16.5 一种高效鲁棒的多楼层室内环境指纹定位方法 同济大学 Zhao Y, Gong W, Li L, et al. An Efficient and Robust Fingerprint Based Localization Method for Multi Floor Indoor Environment[J]. IEEEa Internet of Things Journal, 2023. 2.相关工作 B.基于深度学习的…

固态硬盘优化设置

目录 前言&#xff1a; 关闭Windows Search 禁用系统保护&#xff08;不建议&#xff09; 不建议禁用系统保护原因 关闭碎片整理【机械硬盘】 提升固态硬盘速度 开启TRIM 合理使用固态硬盘的容量 正确关机 关闭开机自启 前言&#xff1a; 电脑配备固态硬盘就能一劳…

自我摸索:如何运营并玩转CSDN?

自注册CSDN以来已有七年之久&#xff0c;但真正运营CSDN也是最近一年的事情&#xff0c;大概就是22年底&#xff0c;参加2022 博客之星 的竞选。接触了很多大佬&#xff0c;也学习模仿着开始玩转CSDN&#xff0c;虽然没有同期运营的大佬们玩的6&#xff0c;但也有一些经验可以来…

this指针相关

一、类对象的存储方式 先说一下结论&#xff1a;一个类的大小&#xff0c;实际就是该类中”成员变量”之和&#xff0c;当然要注意内存对齐 注意空类和没有成员变量的类的大小&#xff0c;编译器给了这两种类一个字节来唯一标识这个类的对象。 class A { public:int _a;int _b…

Python多线程—threading模块

参考&#xff1a;《Python核心编程》 threading 模块的Thread 类是主要的执行对象&#xff0c;而且&#xff0c;使用Thread类可以有很多方法来创建线程&#xff0c;这里介绍以下两种方法&#xff1a; 创建 Thread 实例&#xff0c;传给它一个函数。派生 Thread 的子类&#xf…

计算机体系结构——多处理机系统

一、概述 重要概念 评估指标 通信延迟 通信延迟&#xff1d;发送开销&#xff0b;跨越时间&#xff0b;传输延迟&#xff0b;接收开销 跨越时间 数字信号从发送方的线路端传送到接收方的线路端所经过的时间。 传输时间 全部的消息量除以线路带宽。 多处理机的架构 根…

Unity 之 Addressable可寻址系统 -- HybridCLR(华佗)+Addressable实现资源脚本全热更 -- 实战(二)

Unity 之 Addressable可寻址系统 -- HybridCLRAddressable实现资源脚本全热更 -- 实战 前言实现原理一&#xff0c;HybridCLR相关操作1.1 安装HybridCLR1.2 打包程序集1.2 设置面板1.3 补充元数据1.4 代码加载流程 二&#xff0c;Addressable资源管理2.1 生成热更代码资源2.2 创…

攻防世界——answer_to_everything-writeup

__int64 __fastcall not_the_flag(int a1) {if ( a1 42 )puts("Cipher from Bill \nSubmit without any tags\n#kdudpeh");elseputs("YOUSUCK");return 0LL; } kdudpeh这个东西&#xff0c;根据题目提示sha1加密 import hashlib flagkdudpeh x hashlib…

【Springboot】日志

1.日志的使用 日志主要用于记录程序运行的情况。我们从学习javase的时候就使用System.out.println();打印日志了&#xff0c;通过打印的日志来发现和定位问题&#xff0c;或根据日志来分析程序运行的过程。在Spring的学习中,也经常根据控制台的⽇志来分析和定位问题 。 日志除…

数据分析实战:城市房价分析

流程图&#xff1a; 1.读数据表 首先&#xff0c;读取数据集。 CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATtarget0.00632182.3100.5386.57565.24.09129615.3396.94.98240.0273107.0700.4696.42178.94.9671224217.8396.99.1421.60.0272907.0700.4697.18561.14.9671224217…

大英第四册课后翻译答案

目录 Unit 1Unit 2Unit 3Unit 4小结&#xff1a; Unit 1 中庸思想&#xff08;Doctrine of the Mean&#xff09;是儒家思想的核心内容。孔子所谓的“中”不是指“折中”&#xff0c;而是指在认识和处理客观事物时的一种“适度”和“恰如其分”的方法。孔子主张不仅要把这种思…

街机模拟游戏逆向工程(HACKROM)教程:[14]68K汇编-标志寄存器

在M68K中&#xff0c;有许多条件分支指令&#xff0c;和jmp指令一样也会修改PC达到程序跳转或分支的目的&#xff0c;不过这些会根据一些情况或状态来选择是否跳转。而在M68K中&#xff0c;有一个特别的寄存器来标记这些情况。 CCR(状态标志寄存器) CCR寄存器是用来保存一些对…

微前端-无界wujie

无界微前端方案基于 webcomponent 容器 iframe 沙箱&#xff0c;能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。 主项目安装无界 vue2项目&#xff1a;npm i wujie-vue2 -S vue3项目…

77. 组合 - 力扣(LeetCode)

题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 输入示例 n 4, k 2输出示例 [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]解题思路 我们使用回溯、深度优先遍历的思想&#xff0c;我们使用一个栈 path…

SpringSecurity+OAuth2.0 搭建认证中心和资源服务中心

目录 1. OAuth2.0 简介 2. 代码搭建 2.1 认证中心&#xff08;8080端口&#xff09; 2.2 资源服务中心&#xff08;8081端口&#xff09; 3. 测试结果 1. OAuth2.0 简介 OAuth 2.0&#xff08;开放授权 2.0&#xff09;是一个开放标准&#xff0c;用于授权第三方应用程序…

Leetcode的AC指南 —— 栈与队列:225.用队列实现栈

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;225.用队列实现栈 **。题目介绍&#xff1a;请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 …

简单了解AJAX

文章目录 1、什么是AJAX2、AJAX快速入门3、Axios异步框架3.1、Axios 快速入门3.2、Axios 请求方式别名 1、什么是AJAX 概念&#xff1a;AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML AJAX作用&#xff1a; 与服务器进行数据交换&#xff1a;通…

图卷积GCN实战基于网络结构图的网络表示学习实战

下面的是数据&#xff1a; from,to,cost 73,5,352.6 5,154,347.2 154,263,392.9 263,56,440.8 56,96,374.6 96,42,378.1 42,58,364.6 58,95,476.8 95,72,480.1 72,271,419.5 271,68,251.1 134,107,344.0 107,130,862.1 130,129,482.5 227,167,1425.7 167,298,415.7 298,209,42…

Unity3D学习之Unity基础——3D数学

文章目录 1. 前言2 Mathf和Math基础2.1 一般用于只计算一次的函数2.1.1 PI Π PI2.1.2 取绝对值 Abs2.1.3 向上取整 CeilToInt2.1.4 向下取整 FloorToInt2.1.5 钳制函数 Clamp2.1.6 获取最大值 Max2.1.7 获取最小值 Min2.1.8 一个数的n次幂 Pow2.1.9 四舍五入 RoundToInt2.1.10…

Spring Boot实现统一异常处理的技术解析

引言 在软件开发过程中&#xff0c;异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题&#xff0c;提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架&#xff0c;提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍…