QT6 源(147)模型视图架构里的表格窗体 QTableWidget 的范例代码举例,以及其条目 QTableWidgetItem 类型的源代码。

(1)先用一个简单的例子,学习一下本类里的成员函数的使用。生成如下图的界面,表格窗体与初始数据:

在这里插入图片描述

++查看其 ui_widget . h 文件 ,里面的将是最标准的表格窗体的使用代码 :

#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTableWidget>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QVBoxLayout  * verticalLayout;//主窗体上一个按钮,一个表格窗体。QPushButton  * pushButton ;QTableWidget * tableWidget;void setupUi(QWidget * Widget){if (Widget->objectName().isEmpty())Widget->setObjectName(QString::fromUtf8("Widget"));Widget->resize(136, 120);QFont font;font.setPointSize(14);Widget->setFont(font);       //这一段是设置主窗体,并给予垂直布局Widget->setContextMenuPolicy(Qt::CustomContextMenu);verticalLayout = new QVBoxLayout(Widget);verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));pushButton = new QPushButton(Widget);   //生成按钮组件pushButton->setObjectName(QString::fromUtf8("pushButton"));verticalLayout->addWidget(pushButton);tableWidget = new QTableWidget(Widget); //生成表格窗体if (tableWidget->columnCount() < 3)     //至少三列么?tableWidget->setColumnCount(3);//为表格窗体里的组件起名,起的名字怪怪的,避免重复,俩下划线已经很奇特安全了。QTableWidgetItem * __qtablewidgetitem = new QTableWidgetItem();tableWidget->setHorizontalHeaderItem(0, __qtablewidgetitem);QTableWidgetItem *__qtablewidgetitem1 = new QTableWidgetItem();tableWidget->setHorizontalHeaderItem(1, __qtablewidgetitem1);QTableWidgetItem *__qtablewidgetitem2 = new QTableWidgetItem();tableWidget->setHorizontalHeaderItem(2, __qtablewidgetitem2); //生成水平表头if (tableWidget->rowCount() < 2) //生成两行tableWidget->setRowCount(2);QTableWidgetItem *__qtablewidgetitem3 = new QTableWidgetItem();tableWidget->setVerticalHeaderItem(0, __qtablewidgetitem3);   QTableWidgetItem *__qtablewidgetitem4 = new QTableWidgetItem();tableWidget->setVerticalHeaderItem(1, __qtablewidgetitem4);   //生成垂直表头QTableWidgetItem *__qtablewidgetitem5 = new QTableWidgetItem();tableWidget->setItem(0, 0, __qtablewidgetitem5);  //依次生成表里的每个元素[0,0]QTableWidgetItem *__qtablewidgetitem6 = new QTableWidgetItem();tableWidget->setItem(0, 1, __qtablewidgetitem6);  //[0,1]QTableWidgetItem *__qtablewidgetitem7 = new QTableWidgetItem();tableWidget->setItem(0, 2, __qtablewidgetitem7);  //[0,2]QTableWidgetItem *__qtablewidgetitem8 = new QTableWidgetItem();tableWidget->setItem(1, 0, __qtablewidgetitem8);  //[1,0]QTableWidgetItem *__qtablewidgetitem9 = new QTableWidgetItem();tableWidget->setItem(1, 1, __qtablewidgetitem9);  //[1,1]QTableWidgetItem *__qtablewidgetitem10 = new QTableWidgetItem();tableWidget->setItem(1, 2, __qtablewidgetitem10); //[1,2]tableWidget->setObjectName(QString::fromUtf8("tableWidget"));tableWidget->horizontalHeader()->setVisible(true);//使水平表头可见。tableWidget->horizontalHeader()->setDefaultSectionSize(31);verticalLayout->addWidget(tableWidget); //把表格窗体加入到主窗体地的布局中。retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);//允许通过函数名绑定信号与槽函数。} // setupUivoid retranslateUi(QWidget * Widget){   //设置程序的标题Widget->setWindowTitle(QCoreApplication::translate("Widget", "H", nullptr));pushButton->setText(QCoreApplication::translate("Widget", "pushButton", nullptr));//以下依次赋予行表头与列表头要显示的文本: cA cB cC rA rBQTableWidgetItem *___qtablewidgetitem = tableWidget->horizontalHeaderItem(0);___qtablewidgetitem->setText(QCoreApplication::translate("Widget", "cA", nullptr));QTableWidgetItem *___qtablewidgetitem1 = tableWidget->horizontalHeaderItem(1);___qtablewidgetitem1->setText(QCoreApplication::translate("Widget", "cB", nullptr));QTableWidgetItem *___qtablewidgetitem2 = tableWidget->horizontalHeaderItem(2);___qtablewidgetitem2->setText(QCoreApplication::translate("Widget", "cC", nullptr));QTableWidgetItem *___qtablewidgetitem3 = tableWidget->verticalHeaderItem(0);___qtablewidgetitem3->setText(QCoreApplication::translate("Widget", "rA", nullptr));QTableWidgetItem *___qtablewidgetitem4 = tableWidget->verticalHeaderItem(1);___qtablewidgetitem4->setText(QCoreApplication::translate("Widget", "rB", nullptr));const bool __sortingEnabled = tableWidget->isSortingEnabled();tableWidget->setSortingEnabled(false); //给表格中条目赋值时候不允许排序QTableWidgetItem *___qtablewidgetitem5 = tableWidget->item(0, 0);___qtablewidgetitem5->setText(QCoreApplication::translate("Widget", "0", nullptr));QTableWidgetItem *___qtablewidgetitem6 = tableWidget->item(0, 1);___qtablewidgetitem6->setText(QCoreApplication::translate("Widget", "1", nullptr));QTableWidgetItem *___qtablewidgetitem7 = tableWidget->item(0, 2);___qtablewidgetitem7->setText(QCoreApplication::translate("Widget", "2", nullptr));QTableWidgetItem *___qtablewidgetitem8 = tableWidget->item(1, 0);___qtablewidgetitem8->setText(QCoreApplication::translate("Widget", "3", nullptr));QTableWidgetItem *___qtablewidgetitem9 = tableWidget->item(1, 1);___qtablewidgetitem9->setText(QCoreApplication::translate("Widget", "4", nullptr));QTableWidgetItem *___qtablewidgetitem10 = tableWidget->item(1, 2);___qtablewidgetitem10->setText(QCoreApplication::translate("Widget", "5", nullptr));tableWidget->setSortingEnabled(__sortingEnabled);//最后恢复表格中的排序设置。} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

(2)以下是 表格里的条目 QTableWidgetItem 类型的源代码,定义于头文件 qtablewidget . h无论是什么样的模型与视图里的条目,都是为了存储数据,定义上都大同小异,故不再详细注释了

/*
The QTableWidgetItem class provides an item for use with the QTableWidget class.Detailed Description :
表格项用于存储表格小部件的信息。项目通常包含文本、图标或复选框。
QTableWidgetltem类是一个方便的类,它在Qt 3中替换了QTableWidgetltem类。
它提供了一个可以与QTableWidgetltem类一起使用的项目。
顶级项目在没有父项的情况下构建,然后根据行号和列号指定的位置插入:QTableWidgetItem * newItem = new QTableWidgetItem(tr("%1").arg(pow(row, column+1)));tableWidget->setItem(row, column, newItem);每个项目都可以有自己的背景画笔,这通过`setBackground()、函数来设置。
当前的背景画笔可以通过background ()、函数来获取。
每个项目的文本标签可以使用其特定的字体和画笔来呈现,这通过`setFont ()'和setForeground)函数进行指定,
并通过`font()`和`foreground()'函数来读取。默认情况下,项是启用的,可编辑的,可选择的,可检查的,并且既可以作为拖放操作的源,也可以作为落点目标。
每个项的标记可以通过调用setFlags()函数并传入相应的值(见Qt:ItemFlags)来更改。
可检查的项可以通过setCheckState()函数进行检查和取消检查。
对应的checkState()函数则指示该项当前是否被检查过。Subclassing :
当子类化 QTableWidgetltem 以提供自定义项时,可以为它们定义新类型,以便它们可以与标准项区分开来.
需要此功能的子类的构造函数需要使用等于或大于 UserType 的新类型值调用基类构造函数。*/#ifndef QT_NO_DATASTREAM  //说明本条目可以读写入数据流里进行调试。
Q_WIDGETS_EXPORT QDataStream & operator>>(QDataStream & in , QTableWidgetItem       & item);
Q_WIDGETS_EXPORT QDataStream & operator<<(QDataStream & out, const QTableWidgetItem & item);
#endifclass Q_WIDGETS_EXPORT QTableWidgetItem
{friend class QTableWidget;friend class QTableModel;
private:QTableModel * tableModel() const;private: //可见,表格里的条目还有丰富的数据成员,以描述条目里的数据与属性int                       rtti     ;QList<QWidgetItemData>    values   ; //包含了条目里的数据QTableWidget            * view     ; //本条目属于哪个表格窗体。QTableWidgetItemPrivate * d        ;Qt::ItemFlags             itemFlags; //本条目的编辑属性。public:enum ItemType { Type = 0, UserType = 1000 };//Constructs a table item of the specified type that does not belong to any table.//形参 type会赋值给本类的私有数据成员 rtti,以保存本条目的类型。explicit   QTableWidgetItem(int type = Type); //默认类型是 0inline int type() const { return rtti; }//Returns the type passed to the QTableWidgetItem constructor.//Constructs a table item with the given text.explicit   QTableWidgetItem(const QString & text, int type = Type); //有参构造函数explicit   QTableWidgetItem(const QIcon   & icon,const QString & text, int type = Type);QTableWidgetItem(const QTableWidgetItem & other); //copy构造函数QTableWidgetItem & operator=(const QTableWidgetItem & other);//copy赋值运算符函数virtual ~QTableWidgetItem(); //析构函数virtual bool operator< (const QTableWidgetItem & other) const; //无注释virtual QTableWidgetItem * clone() const; //Creates a copy of the item.//Returns the table widget that contains the item.inline  QTableWidget     * tableWidget() const { return view; }inline int row   () const;inline int column() const;//Returns the row of the item in the table.//If the item is not in a table, this function will return -1.virtual void read (QDataStream & in )      ; //Reads  the item from stream in .virtual void write(QDataStream & out) const; //Writes the item to   stream out.//Returns true if the item is selected, otherwise returns false.bool  isSelected() const;void setSelected(bool select); //Sets the selected state of the item to select./*enum Qt::ItemFlag {NoItemFlags = 0,ItemIsSelectable = 1,ItemIsEditable = 2,ItemIsDragEnabled = 4,ItemIsDropEnabled = 8,ItemIsUserCheckable = 16,ItemIsEnabled = 32,ItemIsAutoTristate = 64,ItemNeverHasChildren = 128,ItemIsUserTristate = 256};Q_DECLARE_FLAGS(ItemFlags, ItemFlag)Q_DECLARE_OPERATORS_FOR_FLAGS(ItemFlags)*/inlineQt::ItemFlags        flags() const { return itemFlags; } //返回条目具有的属性void              setFlags(Qt::ItemFlags flags);virtual QVariant     data(int role) const;               //读写条目里具有的数据。virtual void      setData(int role, const QVariant &value);//以下依次是读写条目里各角色对应的数据。inline QString       text() const         //角色 0{   return data(Qt::DisplayRole).toString(); }inline void       setText(const QString & text){   setData(Qt::DisplayRole, text); }inline QIcon         icon() const         //角色 1{   return qvariant_cast<QIcon>(data(Qt::DecorationRole)); }inline void       setIcon(const QIcon & icon){   setData(Qt::DecorationRole, icon); }inline QString       toolTip() const      //角色 3{ return data(Qt::ToolTipRole).toString(); }inline void       setToolTip(const QString & toolTip){ setData(Qt::ToolTipRole, toolTip); }inline QString       statusTip() const    //角色 4{   return data(Qt::StatusTipRole).toString(); }inline void       setStatusTip(const QString &statusTip){   setData(Qt::StatusTipRole, statusTip); }inline QString       whatsThis() const    //角色 5{   return data(Qt::WhatsThisRole).toString(); }inline void       setWhatsThis(const QString & whatsThis){   setData(Qt::WhatsThisRole, whatsThis); }inline QFont         font() const         //角色 6{   return qvariant_cast<QFont>(data(Qt::FontRole)); }inline void       setFont(const QFont & font){   setData(Qt::FontRole, font); }inline int           textAlignment() const//角色 7{   return data(Qt::TextAlignmentRole).toInt(); }inline void       setTextAlignment(int alignment){   setData(Qt::TextAlignmentRole, alignment); }inline QBrush        background() const   //角色 8{   return qvariant_cast<QBrush>(data(Qt::BackgroundRole)); }inline void       setBackground(const QBrush & brush){   setData(Qt::BackgroundRole,brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }//QBrush(Qt::GlobalColor color, Qt::BrushStyle bs = Qt::SolidPattern);inline QBrush        foreground() const   //角色 9{   return qvariant_cast<QBrush>(data(Qt::ForegroundRole)); }inline void       setForeground(const QBrush &brush){   setData(Qt::ForegroundRole,brush.style() != Qt::NoBrush ? QVariant(brush) : QVariant()); }inline  //enum Qt::CheckState { Unchecked, PartiallyChecked, Checked };Qt::CheckState       checkState() const   //角色 10{   return static_cast<Qt::CheckState>(data(Qt::CheckStateRole).toInt()); }inlinevoid              setCheckState(Qt::CheckState state){   setData(Qt::CheckStateRole, state); }inline QSize         sizeHint() const     //角色 13{   return qvariant_cast<QSize>(data(Qt::SizeHintRole)); }inline void       setSizeHint(const QSize & size){   setData(Qt::SizeHintRole, size.isValid() ? QVariant(size) : QVariant()); }}; //完结 class QTableWidgetItem

(3)

在这里插入图片描述

(4)

谢谢

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

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

相关文章

URL时间戳参数深度解析:缓存破坏与前端优化的前世今生

&#x1f50d; URL时间戳参数深度解析&#xff1a;缓存破坏与前端优化的前世今生 在日常的Web开发中&#xff0c;你是否注意到很多接口URL后面都会带有一个时间戳参数&#xff1f;比如 xxx/getMsg?_1751413509056。这个看似简单的参数背后&#xff0c;却隐藏着前端缓存策略、性…

分布式锁实现方式:基于Redis的分布式锁实现(Spring Boot + Redis)

Redis实现分布式锁的原理 Redis分布式锁基于其单线程执行命令的特性&#xff0c;通过原子操作实现多节点间的互斥访问。下面从原理、实现、问题及优化四个方面详细解析&#xff1a; 1.原子性与互斥性 Redis分布式锁的核心是原子性操作&#xff1a; 获取锁&#xff1a;使用SE…

linux升级降级内核实验

✅实验环境 vmware workstation 17 centos7.9 下载链接&#xff1a; https://vault.centos.org/7.9.2009/isos/x86_64/ ubuntu24.04 下载链接&#xff1a; https://old-releases.ubuntu.com/releases/24.04/ ✅实验目的 为了解决日常环境部署中某些驱动软件依赖特定内…

华为云开始了“开发者空间 AI Agent 开发”活动

引言 今天在华为云App上偶然看到一个新活动&#xff1a;Developer Events_Developer Alliance-Huawei Cloud。这个活动要求开发者可结合自己的工作实践&#xff0c;须在华为开发者空间内完成应用构建&#xff0c;应用构建类型和主题为AI Agent应用开发。 AI Agent平台 华为开…

2025.6.26总结

今天和我做同一业务得同事进行了工作交接&#xff0c;主要给我讲了怎么去执行自动化。包括性能自动化&#xff0c;API自动化&#xff0c;UI自动化&#xff0c;除了UI自动化要写些代码&#xff0c;其他跑得话也就在工具上配个参数&#xff0c;就是个搬砖得活&#xff0c;没太大技…

ip网络基础

交换机工作原理&#xff1a; 自主学习mac地址并成mac地址表 根据mac地址表再进行单播、广播转发 主机通信原理&#xff08;局域网&#xff09;&#xff1a; 需要了解arp协议 拓扑图&#xff1a; 首先&#xff0c;我们观察icmp数据包&#xff0c;发现缺少目标mac地址&#…

AI大模型如何重塑软件开发流程?

文章目录 每日一句正能量前言一、AI大模型的定义与特点&#xff08;一&#xff09;定义&#xff08;二&#xff09;特点 二、AI大模型在软件开发中的应用场景&#xff08;一&#xff09;代码自动生成&#xff08;二&#xff09;智能测试&#xff08;三&#xff09;需求分析与设…

Kafka与RabbitMQ相比有什么优势?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka与RabbitMQ相比有什么优势&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka与RabbitMQ相比有什么优势&#xff1f; 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; Kafka与RabbitMQ在消息队列的设计和应…

LeetCode 2090. 半径为 k 的子数组平均值

题目链接 2090. 半径为 k 的子数组平均值 题目描述 给定一个下标从 0 开始的整数数组 nums 和整数 k&#xff0c;构建并返回一个长度为 n 的数组 avgs&#xff0c;其中 avgs[i] 表示以下标 i 为中心、半径为 k 的子数组的平均值。具体规则如下&#xff1a; 无效位置&#x…

深入理解C++11原子操作:从内存模型到无锁编程

文章目录 C并发编程的新纪元内存模型基础&#xff1a;可见性与有序性数据竞争的根源happens-before关系memory_order枚举详解1. memory_order_relaxed2. memory_order_acquire/memory_order_release3. memory_order_seq_cst 原子操作详解std::atomic模板核心原子操作1. 读取与存…

DQL-1-基础查询

基础查询 DQL-1-基础查询 基础查询DQL - 介绍DQL - 语法DQL - 基本查询案例 DQL - 介绍 SQL 英文全称是 Data Query Language, 数据查询语言, 用来查询数据库中表的记录 查询关键字: SELECT DQL - 语法 SELECT 字段列表FROM 表名列表WHERE条件列表GROUP BY分组字段列表HAVI…

Prompt 精通之路(七)- 你的终极 AI 宝典:Prompt 精通之路系列汇总

你的终极 AI 宝典&#xff1a;Prompt 精通之路系列汇总 标签&#xff1a; #Prompt指南 #AI学习资源 #速查手册 #ChatGPT #系列总结 &#x1f680; Prompt 精通之路&#xff1a;系列文章导航 第一篇&#xff1a;AI 时代的新语言&#xff1a;到底什么是 Prompt&#xff1f;为什么…

P27:RNN实现阿尔茨海默病诊断

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、过程解读 PyTorch 实战&#xff1a;阿尔茨海默病数据预测模型 今天&#xff0c;我将带大家一起探索一个基于 PyTorch 的深度学习小项目——利用 RNN 模…

HakcMyVM-Arroutada

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.21.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-01 07:13 EDT Nmap scan report for 192.168.21.11 Host is up (0.00062s latency). MAC Address: 08:00:27:4E:CC:FB (PCS Systemtechnik/Or…

TEXT Submitting Solutions

前言 USACO 训练项目配备了一个自动评分系统&#xff0c;用于批改你的作业题目。你可以直接在题目页面提交你的程序&#xff1b;系统会对程序进行编译和评分&#xff0c;几秒钟内就能将结果反馈给你。 支持的语言有 C、C&#xff08;含 C11 和 C14&#xff09;、PASCAL、Pyth…

Reactor 瞬态错误

在响应式编程中&#xff0c;retryWhen 操作符通过 RetrySignal 接口提供了对重试行为的精细控制&#xff0c;特别是在处理 瞬态错误&#xff08;transient errors&#xff09; 时。瞬态错误是指那些在一段时间内发生&#xff0c;但随后会自行恢复的错误&#xff0c;例如网络请求…

基于 SpringBoot+Vue.js+ElementUI 的小型超市商品管理系统设计与实现7000字论文设计

摘要 本论文设计并实现了一个基于 SpringBoot、Vue.js 和 ElementUI 的小型超市商品管理系统。该系统旨在为小型超市提供一个高效、便捷的商品管理解决方案&#xff0c;实现商品信息的录入、查询、修改、删除等功能&#xff0c;同时支持库存管理、销售统计等业务需求。论文首先…

Kerberos 认证协议解析

文章目录 概述核心概念认证流程阶段一&#xff1a;Client -> AS&#xff0c;获取 TGT阶段二&#xff1a;Client -> TGS&#xff0c;获取服务票据阶段三&#xff1a;Client -> Server&#xff0c;请求服务 核心安全机制优缺点分析优势局限性 实践与排错关键配置 (krb5.…

【设计模式07】适配器

前言 实现目标&#xff0c;组合源&#xff0c;写个适配方法&#xff0c;适用于没办法改变源&#xff0c;但又想实现目标类。我暂时还没使用到过&#xff0c;但感觉用处还是蛮大的 UML类图 代码示例 package com.sw.learn.pattern.C_structre.a_adapter;public class Main {//…

SPI、I2C和UART三种串行通信协议的--------简单总结

目录 一、3种协议的对比二、典型应用场景三、选型建议 以下是SPI、I2C和UART三种串行通信协议的对比分析及适用场景总结&#xff1a; 一、3种协议的对比 . 对比其他接口 特性ICSPIUART信号线数量2&#xff08;SCL SDA&#xff09;4&#xff08;SCK MOSI MISO SS/CS&…