详解QListView、QListWidget、QTableView、QTableWidget的使用以及区别

在Qt框架中,QListViewQListWidgetQTableViewQTableWidget都是用于显示列表或表格数据的控件。它们在用途、数据模型、灵活性以及直接操作数据的便捷性等方面存在一定的差异。下面将详细阐述这些控件的使用方法以及它们之间的区别,并提供相应的C++代码示例。

1. QListView

使用方法QListView是一个基于模型-视图架构的控件,用于展示列表形式的数据。它本身并不存储数据,而是依赖于一个QAbstractListModel或其子类(如QStandardItemModel)来提供数据。使用时需创建模型,填充数据,然后将模型设置给QListView
在这里插入图片描述

#include <QApplication>
#include <QListView>
#include <QStandardItemModel>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建模型QStandardItemModel model;for (int i = 0; i < 5; ++i) {QStandardItem *item = new QStandardItem(QString("Item %1").arg(i));model.appendRow(item);}// 创建并配置QListViewQListView listView;listView.setModel(&model);listView.setWindowTitle("QListView Example");// 显示窗口listView.show();return app.exec();
}

特点

  • 基于模型:数据存储在独立的模型中,便于分离界面与逻辑,有利于数据复用和同步更新。
  • 高度定制:通过设置delegate可以自定义单元格的外观和编辑行为。
  • 性能优化:对于大量数据,支持虚拟视图模式,只渲染当前视口内的数据,提高滚动性能。

2. QListWidget

使用方法QListWidget是一个更为直接、易于使用的列表控件,它内部已经集成了一个简单的模型,可以直接添加、删除和修改项。
在这里插入图片描述

#include <QApplication>
#include <QListWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建并配置QListWidgetQListWidget listWidget;listWidget.addItem("Item 1");listWidget.addItem("Item 2");listWidget.addItem("Item 3");listWidget.setWindowTitle("QListWidget Example");// 显示窗口listWidget.show();return app.exec();
}

特点

  • 自带模型:无需额外创建模型,可以直接操作项(QListWidgetItem)。
  • 简单易用:提供了丰富的API直接添加、删除、查找和修改项,适合快速开发简单的列表界面。
  • 功能相对有限:相比QListView,自定义能力稍弱,不支持复杂的委托编辑和高级视图特性。

3. QTableView

使用方法QTableView是一个基于模型-视图架构的表格控件,用于展示表格形式的数据。同样需要关联一个QAbstractTableModel或其子类(如QStandardItemModel)来提供数据。
在这里插入图片描述

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建模型并填充数据QStandardItemModel model(3, 4); // 行数、列数for (int row = 0; row < model.rowCount(); ++row) {for (int col = 0; col < model.columnCount(); ++col) {model.setData(model.index(row, col), QString("Cell (%1, %2)").arg(row).arg(col));}}// 创建并配置QTableViewQTableView tableView;tableView.setModel(&model);tableView.setWindowTitle("QTableView Example");// 显示窗口tableView.show();return app.exec();
}

特点

  • 基于模型:与QListView类似,数据存储在独立的模型中,支持模型-视图架构的所有优点。
  • 表格布局:适用于展示二维数据,支持行头、列头和单元格合并等功能。
  • 高度定制:通过设置delegate可以自定义单元格的外观和编辑行为。

4. QTableWidget

使用方法QTableWidget是一个集成模型的表格控件,可以直接添加、删除和修改单元格数据。
在这里插入图片描述

#include <QApplication>
#include <QTableWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建并配置QTableWidgetQTableWidget tableWidget(3, 4); // 行数、列数tableWidget.setHorizontalHeaderLabels({"Col 1", "Col 2", "Col 3", "Col 4"});tableWidget.setVerticalHeaderLabels({"Row 1", "Row 2", "Row 3"});for (int row = 0; row < tableWidget.rowCount(); ++row) {for (int col = 0; col < tableWidget.columnCount(); ++col) {QTableWidgetItem *item = new QTableWidgetItem(QString("Cell (%1, %2)").arg(row).arg(col));tableWidget.setItem(row, col, item);}}tableWidget.setWindowTitle("QTableWidget Example");// 显示窗口tableWidget.show();return app.exec();
}

特点

  • 自带模型:无需额外创建模型,可以直接操作单元格(QTableWidgetItem)。
  • 简单易用:提供了丰富的API直接添加、删除、查找和修改单元格,适合快速开发简单的表格界面。
  • 功能相对有限:相比QTableView,自定义能力稍弱,不支持复杂的委托编辑和高级视图特性。

总结

  • QListViewQTableView 需要与外部模型配合使用,适合需要灵活数据管理、高度定制化界面和大量数据展示的场景。
  • QListWidgetQTableWidget 内置了简单的模型,直接操作项或单元格,适合快速开发、数据结构相对简单的应用。
  • 若项目对界面定制要求不高,且数据规模不大,可优先考虑使用QListWidgetQTableWidget以简化开发流程。若需要处理大量数据、支持复杂的数据显示与编辑逻辑,应选择QListViewQTableView结合自定义模型和委托。

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

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

相关文章

算法课程笔记——蓝桥云课第二次直播

注意是‘’ 都正确 可以理解为a的首地址也是数字&#xff0c;向右1 %p逻辑地址 Cin cout字符串“”单个字符本身‘’&#xff0c;其他时候不用加 这样就可以 逆运算 bool比较真假<从小到大排 11/25 都输出最省事 变成长度为n1的数组 考虑到整个都可能为一个颜色&#xff0c;…

Docker Desktop打开一直转圈的解决办法

安装Docker Desktop之前确保你的Hyper-V已经打开 开启后需要重新安装重新安装重新安装这是最关键的一步&#xff0c;博主自己看了很多教程&#xff0c;最后试着重装了一下解决了 安装DockerDesktop的时候我的电脑根本就没有Hyper-V这个功能选项&#xff0c;可能是这个问题 如…

C51配置115200串口波特率

一、首先用软件模拟 经过验证&#xff0c;用软件配置115200波特率&#xff0c;在C51里面是行不通的&#xff0c;因为寄存器有限 此时应该翻阅手册看看&#xff0c;是否有其他的解决办法 二、查阅手册 发现定时器2&#xff0c;其实是C52的&#xff0c;也正是C52比C51增强的地…

Junit 整合-ApiHug准备-测试篇-013

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 这里简单…

第G8周:ACGAN任务

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 参考论文 这周主要任务就是根据之前GAN&#xff0c;CGAN&#xff0c;SGAN网络架构搭建…

在PostgreSQL中如何实现递归查询,例如使用WITH RECURSIVE构建层次结构数据?

文章目录 解决方案使用WITH RECURSIVE进行递归查询示例代码 总结 在PostgreSQL中&#xff0c;递归查询是一种非常强大的工具&#xff0c;它可以用来查询具有层次结构或树形结构的数据。例如&#xff0c;你可能会在员工-经理关系、目录结构或组织结构图中遇到这样的数据。为了处…

12.Hexo helpers类似函数和data folder数据文件夹

helper Hexo里的helper&#xff0c;或者说是函数 基本上就是小函数&#xff0c;可以在layout布局中使用&#xff0c;可以允许做一些事情 如字符串操作、检查true或false、检查是否在一个页面上、打印出某个页面中的日期或时间特定格式 打开index.ejs trim 可以通过 <%…

模拟电子技术实验(八)

多选题 1.本次实验的目的包括验证的工作原理&#xff1f; A. 反向加法器 B. 过零比较器 C. 滞回比较器 D. 反向比例放大器 答案&#xff1a;BC 评语&#xff1a;10分 单选题 2.该实验稳压管均为左右&#xff1f; A. 4V B. 5V C. 6V …

3.AlexNet--CNN经典网络模型详解(pytorch实现)

看博客AlexNet--CNN经典网络模型详解&#xff08;pytorch实现&#xff09;_alex的cnn-CSDN博客&#xff0c;该博客的作者写的很详细&#xff0c;是一个简单的目标分类的代码&#xff0c;可以通过该代码深入了解目标检测的简单框架。在这里不作详细的赘述&#xff0c;如果想更深…

SVN泄露(ctfhub)

目录 下载安装dvcs-ripper 使用SVN 一、什么是SVN&#xff1f; 使用SVN能做什么&#xff1f; 二、SVN泄露&#xff08;ctfhub&#xff09; SVN源代码漏洞的主要原因&#xff1a; 工具准备&#xff1a;dirsearch、dvcs-ripper 网络安全之渗透测试全套工具篇&#xff08;内…

车载电子电器架构 —— 功能安全开发(首篇)

车载电子电器架构 —— 功能安全开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

ACE框架学习2

目录 ACE Service Configurator框架 ACE_Server_Object类 ACE_Server_Repository类 ACE_Server_Config类 ACE Task框架 ACE_Message_Queue类 ACE_TASK类 在开始之前&#xff0c;首先介绍一下模板类的实例化和使用。给出以下代码 //ACCEPTOR代表模板的方法 template <…