面试题:QTableView和QTableWidget的异同

目录

1.QTableView简介

2.QTableWidget简介

3.QTableView和QTableWidget不同

4.总结


1.QTableView简介

        QTableView是一个基于模型-视图架构的表格控件,用于展示表格形式的数据。同样需要关联一个QAbstractTableModel或其子类(如QStandardItemModel)来提供数据。这意味着数据存储在模型中,而 QTableView 只负责显示和编辑这些数据。它将数据显示与数据存储分离,提供了强大的灵活性和可扩展性,适合处理各种复杂的表格场景。

        它在QT中的类继承关系如下图所示:

它的特点有:

1)高性能:采用懒加载机制,仅渲染可见区域的单元格,适合处理大量数据(如数万行以上)。

2)高度可定制化

  • 支持自定义单元格渲染(通过 QAbstractItemDelegate)。
  • 可定制行高、列宽、排序、筛选等功能。
  • 通过样式表(CSS)修改整体外观。

可自定义单元格的渲染和编辑方式,例如显示进度条、下拉框等:

class ProgressDelegate : public QItemDelegate {
public:void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const override {// 绘制进度条int progress = index.data().toInt();QStyleOptionProgressBar progressBar;// ... 设置进度条参数QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBar, painter);}
};// 使用代理
tableView.setItemDelegateForColumn(2, new ProgressDelegate);

排序与筛选

// 启用排序
tableView.setSortingEnabled(true);// 使用筛选器(如只显示年龄>20的行)
QSortFilterProxyModel proxyModel;
proxyModel.setSourceModel(&originalModel);
proxyModel.setFilterRegExp("^[2-9][0-9]$");
proxyModel.setFilterKeyColumn(1);  // 筛选第2列(年龄)
tableView.setModel(&proxyModel);

3)丰富的交互支持:支持单元格选择、编辑、右键菜单、拖放等操作,并提供相应信号(如 clickeddoubleClicked)。

4)数据库集成:通过 QSqlTableModel 直接连接数据库表:

#include <QSqlTableModel>
QSqlTableModel model;
model.setTable("employees");
model.select();  // 查询数据
tableView.setModel(&model);

2.QTableWidget简介

        QTableWidget继承于QTableView,它是一个结合了模型和视图的控件,它内置了一个简单的表格模型。这意味着你不需要单独管理模型,可以直接通过QTableWidget的方法来操作数据。与 QTableView 相比,QTableWidget 的 API 更简单直接,适合快速开发小规模、静态数据的表格应用。

        它的特点有:

1)集成数据存储:无需额外的数据模型(如 QStandardItemModel),可直接通过 setItem()setCellWidget() 操作单元格数据。

2)简单易用:提供直观的 API,适合初学者快速实现表格功能,例如:

QTableWidget table(4, 2);  // 创建4行2列的表格
table.setItem(0, 0, new QTableWidgetItem("张三"));

3)基本功能齐全: 支持单元格选择、编辑、排序、行 / 列隐藏等常见操作。

4)视觉定制:可通过样式表(CSS)修改外观,或通过 setCellWidget() 添加自定义控件(如按钮、下拉框)。

3.QTableView和QTableWidget不同

特性QTableViewQTableWidget
数据模型基于 MVC(模型 - 视图 - 控制器)架构,需配合QAbstractItemModel子类(如QStandardItemModelQSqlTableModel)使用。数据与视图分离,支持大型数据集。内置数据存储(直接操作单元格),无需额外模型。适合小规模静态数据。
使用复杂度需手动创建和配置模型,学习成本较高,但灵活性极强。开箱即用,API 简单直接,适合快速开发。
性能处理大量数据时性能更佳(如数万行以上),仅渲染可见区域。数据量较大时性能下降,因所有单元格预分配。
扩展性可自定义模型实现高级功能(如异步加载、远程数据)。扩展困难,需继承并重写大量方法。
单元格操作通过模型间接操作数据(如model.setData(index, value))。直接通过setItem()setCellWidget()操作单元格。

典型应用场景

  • QTableView

    • 数据量庞大(如数据库查询结果)。
    • 需要与其他组件共享数据模型。
    • 需要自定义数据展示逻辑(如图标、富文本、进度条)。
  • QTableWidget

    • 数据量较小且固定。
    • 快速原型开发或简单表格需求。
    • 直接操作单元格内容(如 Excel 式编辑)。

示例代码:QTableView + QStandardItemModel(C++)

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建模型QStandardItemModel model(4, 2);  // 4行2列model.setHorizontalHeaderLabels({"姓名", "年龄"});// 设置数据model.setItem(0, 0, new QStandardItem("张三"));model.setItem(0, 1, new QStandardItem("25"));// 创建视图并设置模型QTableView tableView;tableView.setModel(&model);tableView.show();return a.exec();
}

QTableWidget(C++)

#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建表格,设置行列数QTableWidget tableWidget(4, 2);tableWidget.setHorizontalHeaderLabels({"姓名", "年龄"});// 设置数据tableWidget.setItem(0, 0, new QTableWidgetItem("张三"));tableWidget.setItem(0, 1, new QTableWidgetItem("25"));tableWidget.show();return a.exec();
}

4.总结

  • 选 QTableView:当需要处理复杂数据逻辑或大量数据时,它提供更好的性能和可维护性。
  • 选 QTableWidget:当需求简单且数据量较小时,它能快速实现功能。

        实际开发中,建议优先使用QTableView,因为 MVC 架构更符合软件工程原则,便于代码扩展和维护。

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

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

相关文章

smbd:快速拉取服務端SMB共享文件脚本工具

地址:https://github.com/MartinxMax/smbd smbd 是一款簡單的 Bash 腳本&#xff0c;用於自動化從共享目錄透過 SMB/CIFS 協議下載檔案的過程。此工具設計用來與遠端 SMB 分享進行互動&#xff0c;並將其內容下載到本地目錄中。 環境需求 $ apt install smbclient 使用方式 …

MiInsertVad函数分析之nt!MMVAD结构

MiInsertVad函数分析之nt!MMVAD结构 1: kd> dt nt!MMVAD 89520270 0x000 u1 : __unnamed 0x004 LeftChild : (null) 0x008 RightChild : (null) 0x00c StartingVpn : 0x2b0 0x010 EndingVpn : 0x2c5 0x014 u …

OSPF不规则区域划分

1、建立一条虚链路 vlink 可以被视为是⻣⼲区域的⼀段延伸。 这⼀条虚拟的链路&#xff0c;只能够跨域⼀个⾮⻣⼲区域。 [r2-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3 [r3-ospf-1-area-0.0.0.1]vlink-peer 2.2.2.2 在没有建立虚链路之前,r1是不能ping r4的。vlink建⽴的邻居关…

Webug4.0靶场通关笔记-靶场搭建方法(3种方法)

目录 一、虚拟机绿色版本 1. 开启phpstudy 2. 访问靶场 二、Docker版本 1.拉取镜像 2.启动镜像 三、源码安装版本 1. 搭建环境 &#xff08;1&#xff09;安装PHPStudy &#xff08;2&#xff09;WeBug4.0靶场源码 &#xff08;3&#xff09;安装Navicat &#xff…

Linux:进程间通信---消息队列信号量

文章目录 1.消息队列1.1 消息队列的原理1.2 消息队列的系统接口 2. 信号量2.1 信号量的系统调用接口 3. 浅谈进程间通信3.1 IPC在内核中数据结构设计3.2 共享内存的缺点3.3 理解信号量 序&#xff1a;在上一章中&#xff0c;我们引出了命名管道和共享内存的概念&#xff0c;了解…

电子电器架构 --- 车载网关的设计

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 钝感力的“钝”&#xff0c;不是木讷、迟钝&#xff0c;而是直面困境的韧劲和耐力&#xff0c;是面对外界…

华为云Git使用与GitCode操作指南

案例介绍 本文档带领开发者学习如何在云主机上基于GitCode来使用Git来管理自己的项目代码,并使用一些常用的Git命令来进行Git环境的设置。 案例内容 1 概述 1.1 背景介绍 Git 是一个快速、可扩展的分布式版本控制系统,它拥有异常丰富的命令集,可以提供高级操作和对内部…

ESP32开发入门(七):HTTP开发实践

一、HTTP协议基础 1.1 什么是HTTP&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;用于从服务器传输超文本到本地浏览器。它是一种无状态的请求/响应协议&#xff0c;工作…

Python 对象引用、可变性和垃圾 回收(变量不是盒子)

变量不是盒子 1997 年夏天&#xff0c;我在 MIT 学了一门 Java 课程。Lynn Andrea Stein 教授 &#xff08;一位获奖的计算机科学教育工作者&#xff0c;目前在欧林工程学院教书&#xff09;指 出&#xff0c;人们经常使用“变量是盒子”这样的比喻&#xff0c;但是这有碍于理…

局域网常用的测速工具,Iperf3使用教程

目录 下载方式 Windows Linux 使用方法&#xff1a;测试局域网带宽 步骤一&#xff1a;服务端准备 步骤二&#xff1a;客户端发起连接 步骤三&#xff1a;查看结果 参数说明 1. Iperf常用参数&#xff08;测试够用&#xff09; 2. 通用参数&#xff08;Server端和Cli…

《深入理解分布式系统》之认识分布式系统

本文是阅读深入理解分布式系统第一章认识分布式系统时的笔记。 分布式系统的特点 多进程不共享操作系统不共享时钟 分布式系统 由多个可独立运行的子系统组成。每个子系统可以独立选择运行平台。不同的运行平台存在差异&#xff0c;比如操作系统&#xff0c;硬件规格等。由…

UE5 PCG学习笔记

https://www.bilibili.com/video/BV1onUdY2Ei3/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 一、安装PCG 插件里选择以下进行安装 移动目录后&#xff0c;可以使用 Update Redirector References&#xff0c;更新下&#xff0…

工业现场ModbusTCP转EtherNETIP网关引领生物现场领新浪潮

生物质发生器是一种能够产生、培养生物的设备。客户现场需要将生物发生器连接到罗克韦尔系统&#xff0c;但是二者协议无法直接通讯&#xff0c;需要通过ModbusTCP转Ethernet/IP网关将两者进行通讯连接&#xff0c;生物质发生器以其独特的工作原理和优势&#xff0c;使得生物的…

宝蓝德中间件部署war包时,配置的绝对路径读取错误。

文章目录 问题场景解决办法宝蓝德是什么&#xff1f;&#xff1f;一、基础环境与依赖配置二、自动化部署工具链三、高可用性与集群配置四、安全与合规性措施五、产品线差异化部署六、典型部署流程示例七、运维与优化 原因1. 明确“当前工作目录”与“绝对路径”的关系2. 问题根…

Java、Python、NodeJS等开发环境安装及配置镜像加速到国内源

文章目录 Java1.Windows1.1 scoop方式安装JDK 2.Linux2.1 apt方式安装JDK2.1.1 切换JDK2.1.2 验证版本2.1.3 原理 Python1.Windows1.1 scoop方式安装Python1.2 uv方式安装Python&#xff08;推荐&#xff09; 2.Linux2.1 apt方式安装Python2.1.1 配置版本切换2.1.2 切换Python2…

Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 0.准备 1&#xff09;防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…

MCP(Model Context Protocol)是专为LLM(大语言模型)应用设计的标准化协议

核心定义 MCP&#xff08;Model Context Protocol&#xff09;是专为LLM&#xff08;大语言模型&#xff09;应用设计的标准化协议&#xff0c;通过安全可控的方式向AI应用暴露数据和功能。主要提供以下能力&#xff1a; 标准化的上下文管理安全的功能调用接口跨平台的数据交…

Fiori学习专题三十四:Responsiveness

在这一步中&#xff0c;我们提高了应用程序的响应能力。SAPUI5应用程序可以在手机、平板电脑和台式机设备上运行&#xff0c;我们可以配置应用程序以充分利用每种场景的屏幕状态。幸运的是&#xff0c;像sap.m.Table这样的SAPUI5控件已经提供了许多我们可以使用的功能。 1.修改…

解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题

#工作记录 以下是针对 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;适用于 FramePack项目中。 &#xff08;一般该错误的发生原因请重点排查Hugging Face模型仓库受限需要登录的情形&#xff09; FramePack项目参考资料 FramePack部署&#xff08;从PyCharm解…

obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?

不会立即回收。 具体原因是&#xff1a; 赋值 obj null; 后&#xff0c;对象变成“不可达”&#xff0c;符合垃圾回收条件&#xff0c;但垃圾回收器并不会立刻回收它。垃圾回收是CLR自动控制的非确定性过程&#xff0c;什么时候执行回收取决于系统内存压力、GC策略、分代情况…