向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第1种方法)

Qt QTableView深度解析:从模型-视图原理到高性能表格实战 在桌面应用开发中,表格数据展示与交互是核心需求。模型-视图-控制器(MVC)及其变体(如Qt中的模型-视图-代理)是解决数据与UI解耦的经典设计模式。其原理在于将数据管理(模型)、数据显示(视图)和编辑/渲染控制(代理)分离,从而提升代码的可维护性、可测试性和复用性。该架构的技术价值在于能高效处理海量数据、支持复杂定制化交互,并轻松适配不同的数据源与视图形态。在Qt框架中,QTableView是这一模式的典型视图组件,尤其适用于金融行情、工程软件等需要高性能、实时刷新及深度定制的生产级应用场景。本文将结合Q 阅读详情

目录

1.前言

2.利用QAbstractItemView类的setIndexWidget函数实现

3.后记


1.前言

工作中经常会遇到这样的需求:向QAbstractItemView子类如QTreeView、QTableView单元格插入窗体小部件,如:进度条、按钮、单行编辑框等。下面链接的系列博文就是讲解如何实现该功能的。

这些系列博文所说的技术点适用于同时满足下面条件的所有类:

  • 模型类从 QAbstractItemModel派生。

  • 代理类从QStyledItemDelegate或QItemDelegate派生。

  • 视图类是QAbstractItemView的子类。

这些系列博文用到了Qt的model/view framework框架,如果对Qt的“模型/视图/代理”框架不懂,这些系列文章很难读懂。如果不懂这方面的知识,请在Qt Assistant 中输入Model/View Programming 学习了解。读者本机Qt安装目录下的Examples\Qt-XX.XX.XX\widgets\itemviews目录下有很多model/view framework的例子,可以进行自学了解,其中XX.XX.XX为Qt的版本号,如:5.14.1。

因为QColumnView、QHeaderView、QListView、QTableView、QTreeView、QListWidget 、QUndoView、QTableWidget、QTreeWidget都是从QAbstractItemView继承,故这些系列博文所说的技术点也适用于这些类。

本博文通过Qt的QAbstractItemView视图基类自带的函数来实现该功能。

2.利用QAbstractItemView类的setIndexWidget函数实现

QAbstractItemView类有个setIndexWidget函数,该函数声明如下:

void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)

第1个参数是模型索引,你可以想象为就是一个单元格所在的行列索引号。如果该参数无效,例如是根节点索引时,则这个函数什么都不做。

第2个参数是单元格要插入的窗体部件。注意:窗体部件autoFillBackground 属性要设置为true,否则窗体背景色是透明的。如果在指定索引处的A窗体被后来的窗体B替换,则A窗体被删除,如下:

 
  setIndexWidget(index, new QLineEdit);
  ...
  setIndexWidget(index, new QTextEdit);

则QLineEdit会被删除。本函数仅仅能用来根据项的数据在可见区域显示一些静态内容,如果需要显示一些动态内容或者显示一个自定义的编辑框部件,需通过子类化QStyledItemDelegate类实现。

以QTableView为例子来说明。 为了给QTableView提供数据,必须实现一个模型即从QAbstractTableModel.类派生出自己的模型类来,模型类model.cpp代码如下:

#include "model.h"
CModel::CModel(QObject *parent)
    : QAbstractTableModel(parent)
{}
 
CModel::~CModel()
{}
 
QVariant CModel::data(const QModelIndex& index, int role/* = Qt::DisplayRole*/) const
{
    return QVariant();
}
 
// 作为例子,假想QTableView有2列
int CModel::columnCount(const QModelIndex& parent/* = QModelIndex()*/) const
{
    return 2;
}
 
// 作为例子,假想QTableView有88行
int CModel::rowCount(const QModelIndex& parent/* = QModelIndex()*/) const
{
    return 88;
}
 
QVariant CModel::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const
{
    if (orientation != Qt::Horizontal) // 作为例子演示,我们只关心表头是水平的情况
        return QVariant();
 
    if (role != Qt::DisplayRole)// 作为例子演示,我们只关心 Qt::DisplayRole
        return QVariant();
 
    // 构造列,第1列列名为"button";第2列列名为"checkbox"
    if(0 == section)
     return "button";
    else if(1 == section)
        return "checkbox";
 
    return QVariant();
}

QtWidgetsApplication1.cpp实现如下:

#include "QtWidgetsApplication1.h"
#include "model.h"
#include<QPushButton>
#include<QScrollBar>
#include<QCheckBox>
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
 
    m_pModel = new CModel(this); // new出一个模型对象
    ui.tableView->setModel(m_pModel);// 将表格视图的模型对象设置为上步构建出来的模型对象

    installWidget();
}

void QtWidgetsApplication1::installWidget()
{
    auto nRowCount = m_pModel->rowCount();   // 获取表视图有多少行
    auto nColCount = m_pModel->columnCount();// 获取表视图有多少列
 
  // 表视图对象中的每行第0列插入一个QPushButton按钮,在第1列插入一个QCheckBox对象
    for (auto nRowIndx = 0; nRowIndx < nRowCount; ++nRowIndx)
    {
        auto modelIndx = m_pModel->index(nRowIndx, 0);
        QString qsText(QString("button%1").arg(nRowIndx));
        ui.tableView->setIndexWidget(modelIndx, new QPushButton(qsText, this));
 
        modelIndx = m_pModel->index(nRowIndx, 1);
        qsText = (QString("checkbox%1").arg(nRowIndx));
        ui.tableView->setIndexWidget(modelIndx, new QCheckBox(qsText, this));
    }
}
 

installWidget函数利用setIndexWidget函数在表视图对象中的每行第0列插入一个QPushButton按钮,在第1列插入一个QCheckBox对象。效果如下:

3.后记

如果是QTableWidget类,则也可以用如下函数插入窗体小部件:

void QTableWidget::setCellWidget(int row, int column, QWidget *widget)

如下代码:

setCellWidget(row, column, new QLineEdit);
setCellWidget(row, column + 1, new QTextEdit);

实现向第row行的column列和column+1列分别插入了一个QLineEdit和一个QTextEdit窗体小部件。

表格QTableView单元中添加控件 本文主要总结在Qt5.9中,用表格类QTableView,在表格单元中添加控件用法。想要在表格QTableView中添加控件,有多种方法,可以参考如下地址:http://qimo601.iteye.com/blog/1538364。其中,我用的是最常用和简单的方式,使用函数QTableView::setIndexWidget(const QModelIndex &amp;index, QWidge... 阅读详情

相关推荐

QT模型视图(QAbstractItemView抽象视图的使用)

QAbstractItemView抽象视图的使用程序主窗口的编写(创建模型和一个QTableView显示)HistogramView函数(继承QAbstractItemView抽象类来显示柱状图)效果展示 程序 主窗口的编写(创建模型和一个QTableView显示) .h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWi...

weixin_44011306的博客 755

Qt应用开发(基础篇)——视图基类 QAbstractItemView

类继承于QWidget,为全部视图类提供了基本的功能。类是一个抽象类,不能被实例化使用,它是QtWidget框架中树视图QTreeView、列表视图QListView、表格视图QTableView、单列视图和标题头这些视图框架的虚拟父类。类提供了对键盘和鼠标导航视口滚动项目编辑和选择的标准支持。键盘导航--按键描述上/下/左/右箭头键改变当前的项并选中它Ctrl+箭头键改变当前的项但是不选中它Shift+箭头键改变当前的项并选中它,之前选中的项不会被取消选中Ctrl+Space。

波塞冬的博客 2043

自绘QTreeView,添加QPushbutton,并用样式设置按钮,进行美化

自绘QTreeView,添加QPushbutton,并用样式设置按钮,进行美化

Qt模型视图框架:QAbstractItemView

一、描述 QAbstractItemView 类是每个使用 QAbstractItemModel 的标准视图的基类。 QAbstractItemView 是一个抽象类,本身不能被实例化。 它提供了一个标准接口,用于通过信号和槽机制与模型进行互操作,使子类能够随着模型的变化保持最新。此类为键盘和鼠标导航、视口滚动、项目编辑和选择提供标准支持。键盘导航实现了这个功能: 方向键更改当前项目并选择它。 Ctrl方向键更改当前项目但不选择它。 Shift+方向键键更改当前项目并选择它。 Ctr+Space

友善啊,朋友的博客 5216

代码生成 | 安时积分法模型搭建

安时积分法是电池电量计量最基础的方法,今天我们用simulink建模的方式做一个安时积分模型,从而更好地理解安时积分的思想也掌握建模的基础操 ​新建文件 打开MATLAB启动simulink新建一个模型文件 定义变量 和手写代码一样,先定义几个后面要用到的变量,在simulink建模时新建变量用Data Store Memory模块。双击填入要定义的变量名,然后在signal attributes赋初值 如此方法新建四个变量current(电流)初值1000mA、tatol_cap(总容量

ningvay的博客 1万+

群晖NAS搭建Git Server避坑指南:从SSH配置到权限管理的完整流程

本文提供了一份详尽的群晖NAS搭建Git Server实战指南。文章从启用并安全配置SSH服务入手,深入解析了用户权限体系设计、SSH连接与仓库初始化、客户端SSH密钥配置等核心步骤,并提供了常见错误排查与生产环境加固方案,帮助开发者成功构建私有、安全的代码托管平台。

rock5的博客 420

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第2种方法)

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第2种方法)

danshiming的博客 2873

用Python写个彩票小助手:自动生成双色球/大乐透号码并保存到桌面

本文介绍如何使用Python开发一个智能彩票助手,实现双色球和大乐透号码的随机生成与桌面文件保存功能。通过详细的代码示例,包括随机号码生成、文件操作、用户交互和错误处理,帮助Python初学者快速掌握实用工具开发技巧。

weixin_42566121的博客 516

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第3种方法)

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第3种方法)

danshiming的博客 1543

2026 最新实战教程:AI 重构开发全流程(从需求→上线→运维)

1)做什么系统2)技术栈3)功能模块4)部署要求plaintext我要做一个:待办事项(Todo)全栈应用技术栈:前端:React + TypeScript + Tailwind后端:Node.js + Express + MongoDB部署:Docker + 本地运行(后续可上云)功能:- 增删改查任务- 任务状态切换(完成/未完成)- 简单错误处理请按企业级标准生成:架构设计 + 全部代码 + 接口文档 + 启动命令。

qq_35779316的博客 1690

3. NVIDIA GPU Xid 常见错误码全解析、故障定位与标准化处理方案

摘要: Xid是NVIDIA显卡驱动记录的硬件/软件异常日志,通过dmesg等工具可获取,包含PCI总线、GPU编号、故障码等信息,是诊断显卡问题的核心依据。Xid故障分为四类:应用程序类(如代码错误,Xid13/31)、显存ECC硬件类(如显存损坏,Xid48/63)、链路/供电温控类(如PCIe故障,Xid74/79)和GSP固件类(如静电干扰,Xid119/154)。排查流程包括日志采集、软件修复(如重启进程、升级驱动)、硬件检查(如PCIe链路状态)及断电复位(针对GSP故障)。预防措施包括监控EC

jundao1997的专栏 668

向QTableView、QTreeView单元格插入窗体小部件的功能实现

向QTableView单元格插入窗体小部件的功能实现

danshiming的博客 5414

【嵌入式DIY实例ESP32篇】-步数计数器

在本项目中,我们将使用 ESP32 微控制器和博世的 BMI160 加速度计陀螺仪模块构建一款便携式计步器

视觉与物联智能 803

QAbstractItemView子类如:QTreeView、QTableView等子项单元格复选框勾选/取消勾选功能实现

实现QTreeView子项中的复选框勾选/取消勾选功能

danshiming的博客 2733

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1346

实战篇| app爬虫不用真机

之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂)

youbingchen的博客 596

【Qt】控件概述(5)—— 多元素控件

QListWidget,QTableWidget,QTreeWidget

qq_74276498的博客 1042

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[Qt基础内容-10] Qt MVC的V(View)

Qt有自己的MVC框架,分别是model(模型)、view(视图)、delegate(委托),这篇文章,简单的介绍以下Qt中有关view(视图)的类以及一些基本的使用。

qq_44723937的博客 1574

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Qt Model/View 编程深度解析报告

本文介绍了Qt框架中的Model/View架构,该架构通过分离数据与视图解决了传统GUI开发中的数据冗余和同步问题。文章首先分析了传统基于项控件的局限性,指出其数据耦合导致的维护成本上升。随后阐述了Model/View对MVC模式的改进,合并视图和控制器角色并引入委托机制,形成了Model/View/Delegate范式。 核心内容围绕三大组件展开: 模型作为数据抽象层,通过QAbstractItemModel标准接口统一访问各类数据源,提供QAbstractListModel和QAbstractTable

greenspan的专栏 2177

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

QtQuick学习笔记(三)单元视图组件

基于模型的列表/图标视图,不显示表头和表框。

weixin_44812601的博客 1285

QT_ModelViewDelegate附带员工信息表的增删改查案例

Qt_ModelViewDelegate 通常指的是 Qt 框架中的 Model-View-Delegate (MVD) 架构。这是一种用于界面组件显示与编辑数据的核心设计模式,旨在实现数据与界面的分离。

前端开发工程师 299

Qt6界面组件深度解析:从核心原理到实战优化

在C++图形界面开发领域,模型-视图架构是实现数据与显示分离的核心设计模式,它通过解耦数据模型与用户界面,显著提升了应用的可维护性和性能。其原理在于将数据管理、界面展示和交互逻辑分层处理,利用信号与槽机制实现高效通信。这一架构的技术价值在于能够轻松应对动态数据更新、复杂数据展示以及大规模数据集的流畅渲染,尤其适用于桌面应用、数据管理工具和嵌入式系统界面等场景。本文聚焦Qt6框架,深入剖析其Widgets模块中QTableView、QListView等关键组件的实现机制,并结合QSS样式表定制技巧,探讨如何在

weixin_30856725的博客 500

NodeGui 中 QStandardItemModel 完整指南:标准项数据模型的 API 解析与视图绑定实战

QStandardItemModel 是 NodeGui(基于 Node.js 与 Qt 的跨平台原生桌面应用框架)中对 Qt `QStandardItemModel` 类的 TypeScript 封装,用于以"标准项"(QStandardItem)为基本单元组织表格、列表、树形数据,并通过 Qt 的 Model/View 架构将其呈现在 QTableView、QListView、QComboBo

gitblog_00698的博客 389

Qt模型/视图架构实战:从零构建C++通讯录管理应用

在C++ GUI开发中,模型/视图架构是一种实现数据与界面逻辑分离的核心设计模式。其原理是通过模型(Model)管理数据、视图(View)负责展示、委托(Delegate)处理渲染与编辑,三者通过信号与槽机制协同工作。这种架构的技术价值在于提升代码可维护性、支持多视图同步及高效处理大型数据集,广泛应用于数据库前端、文件管理器等复杂数据驱动界面。本文以通讯录管理为例,深入解析如何基于Qt框架实现自定义表格模型,涵盖QAbstractTableModel的核心接口重写、数据修改协议以及QTableView的集成

weixin_30256901的博客 361

Qt模型视图模式详解:从数据分离到自定义委托实战

在软件架构中,解耦是提升可维护性和扩展性的核心原则。模型视图模式正是这一思想的经典实践,它将数据管理与界面展示分离,通过标准化的接口实现数据与UI的独立演化。其技术价值在于支持同一数据源的多视图展示、自动同步更新以及高度定制化的渲染逻辑。在GUI开发领域,该模式广泛应用于表格、列表、树形控件等数据密集型界面。本文聚焦Qt框架中的模型视图实现,深入剖析QAbstractItemModel、QTableView等核心组件,并结合自定义委托和文件浏览器案例,展示如何构建高性能、易维护的数据展示界面。通过理解数据角

weixin_33797791的博客 393

Qt模型/视图架构实战:C++桌面应用数据与界面分离开发指南

在桌面应用开发中,数据与界面显示的分离是提升代码可维护性和性能的关键设计模式。Qt框架的模型/视图架构正是这一理念的经典实现,它通过定义清晰的职责边界,将数据管理、用户界面和渲染逻辑解耦。模型负责数据的存储与访问,视图负责数据的可视化呈现,而委托则定制单元格的渲染与编辑行为。这种架构的核心技术价值在于支持单一数据源、高效处理大规模数据,并允许灵活切换不同的视图表现。在实际工程实践中,它广泛应用于需要动态展示结构化数据的场景,如数据库管理系统、文件浏览器和实时监控面板。本文以构建一个联系人管理器为例,深入解析

weixin_33919950的博客 422
上一篇: Q_DISABLE_COPY、Q_DISABLE_MOVE、Q_DISABLE_COPY_MOVE用法详解及总结
下一篇: 向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第2种方法)
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值