Qt开发之QTableWidget

2023-11-02

QTableWidget从继承QTableView,实质属于模型-视图范畴之内,只是带了默认模型(model)基于项目(item)的表格视图控件。我们不需要实现model内的数据加工。QTableWidget为应用程序提供了标准的表显示工具。QTableWidget中的项目(item)是由QTableWidgetItem来实现。QTableWidget各种属性可利用Qt自带的UI设计师来设置,如下图:

接下来我们定制 2行4列的表格视图。主要的代码 setRowCount,setColumnCount,setHorizontalHeaderLabels,setItem完成一个数据的填充。

    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置表格不能编辑
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    ui->tableWidget->verticalHeader()->setVisible(false);  //去除左右的列序号
    ui->tableWidget->setStyleSheet("QHeaderView::section { border:none; height:30px;color:#555555;background:#F2F5F8;}QTableView::item:selected{background:#87CEFA;}");
    ui->tableWidget->horizontalHeader()->setVisible(true); //去除表头
    ui->tableWidget->setShowGrid(true); //设置显示格子线
    ui->tableWidget->setColumnCount(4);//设置4列
    ui->tableWidget->setColumnWidth(0, 111);
    ui->tableWidget->setColumnWidth(1, 111);
    ui->tableWidget->setColumnWidth(2, 111);
    ui->tableWidget->setColumnWidth(3, 111);
    ui->tableWidget->setRowCount(2);//设置2行
    ui->tableWidget->horizontalHeader()->setFixedHeight(30); //表头高度
    ui->tableWidget->verticalHeader()->setDefaultSectionSize(28); //设置表格行高
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    QStringList headerText;
    headerText<< tr("类型1")<< tr("类型2") << tr("类型3") << tr("类型4"); //表头标题用QStringList来表示
    ui->tableWidget->setHorizontalHeaderLabels(headerText); 
    ui->tableWidget->setColumnCount(headerText.count());//列数设置为与 headerText的行数相等
    
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);//固定表头
    ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
    for (int row = 0; row < ui->tableWidget.rowCount(); ++row) 
    {
        for (int col = 0; col < ui->tableWidget->columnCount(); ++col) 
        {
            switch (col) 
            {
            case 0:
                item = new QTableWidgetItem("语文");
                break;
            case 1:
                item = new QTableWidgetItem("数学");
                break;
            case 2:
                item = new QTableWidgetItem("英语");
                item->setTextColor(QColor(57, 125, 238));
                break;
            case 3:
                item = new QTableWidgetItem("物理");
                item->setTextColor(QColor(57, 125, 238));
                break;
            }
            item->setTextAlignment(Qt::AlignCenter);//文本对齐格式
            ui->tableWidget->setItem(row,col,item);//为单元格设置Item
        }
        row++;
    }

操作起来很简单,但是在实际的业务场景中,我们更希望的是能从每一项获得业务数据模型,使用 QTableWidgetItem中的setData()方法。假设自定义业务模型类:class iteminfo

iteminfo k;
QVariant vart;
vart.setValue(k);
QTableWidgetItem *item = new QTableWidgetItem();
item->setData(Qt::UserRole,vart);

获取数据
item->data(Qt::UserRole).value<iteminfo>();

这边涉及到了两点,第一,业务数据模型,是人为自定义,所以需要向Qt 元对象系统(Meta-Object)申明该类型,Q_DECLARE_METATYPE(iteminfo),添加Q_DECLARE_METATYPE()宏将使所有基于模板的函数(包括QVariant)都知道该类型。注意,如果打算在队列信号和槽连接或QObject的属性系统中使用该类型,还必须在构造函数中调用qRegisterMetaType("iteminfo")函数,因为名称是在运行时解析的。

UI样式优化

在开发过程中 在用户体验上有些瑕疵,就是当选中某一行时,选中项出现虚线框并且某些项字体带有颜色的全消失了都恢复了默认颜色(黑色)。使用qss修改样式由于数据本身的颜色可以发生变化。所以不适合使用。这里使用QStyledItemDelegate(代理)的方式

#ifndef ITEMDELEGATE_H
#define ITEMDELEGATE_H

#include <QStyledItemDelegate>

class ItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    ItemDelegate(QObject *parent = nullptr);
    virtual void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
};

#endif // ITEMDELEGATE_H

#include "itemdelegate.h"
#include "style/theme.h"
#include <QPainter>

ItemDelegate::ItemDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
    
}

void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyleOptionViewItem  viewOption(option); 
    if (viewOption.state & QStyle::State_Selected)
    {
        painter->fillRect(viewOption.rect, QBrush(UI_SELECTTIEM_COLOR));
         viewOption.state = viewOption.state & 0;//去掉选中时的虚线框
    }
    else
    {
        if (index.row() % 2 == 0)
        {
            painter->fillRect(viewOption.rect, QBrush(UI_EVENROW_COLOR));
        }
        else
        {
            painter->fillRect(viewOption.rect, QBrush(UI_ODDROW_COLOR));
        }
        if (viewOption.state & QStyle::State_HasFocus) {//去掉虚线框
            viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
        }
    }
    paintItemData(painter, viewOption, index.data(Qt::UserRole));
    //如何做得通用 每个view 都有基础样式比如:交替变化色,悬浮色,选中色等
    //再构造一个虚函数 子类化该基础样式
    
    //高亮显示与普通显示时的前景色一致(即选中行和为选中时候的文字颜色一样)  
    viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());  
    //viewOption.palette.setColor(QPalette::Foreground, UI_SELECTTIEM_COLOR);  
    QStyledItemDelegate::paint(painter, viewOption, index);
}

结果如下图所示:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt开发之QTableWidget 的相关文章

随机推荐

  • 关于queue_depth的调整

    queue depth是指hdisk层面上命令队列的深度 它针对的是hdisk 如果有多路径软件的话 它针对的就是多路径的hdisk 如powerdisk dlmfdrv 那如何调整queue depth 何时调整呢 more 首先我们来讲
  • STEAM创客教育如何激发孩子的学习兴趣

    如何才能够提高孩子的学习兴趣呢 这是任何一种教育形式都应该思考的问题 在STEAM创客教育中 格物斯坦小坦克告诉你激发孩子的学习兴趣主要包括以下几个方面 数学与艺术的结合 孩子最早接触的艺术是涂色 最早接触的数学是数字 所以数学和艺术结合最
  • MarkDown标题自动添加编号

    转自 MarkDown标题自动添加编号 说明 这是一个实现给本地 Markdown 文件添加标题编号的 python 脚本 可与 Markdown文件自动生成目录 搭配使用 比如说你现在有一个 Markdown 文件 这个文件有很多级标题且
  • Linux系统中关闭看门狗的指令

    1 echo V gt dev watchdog 关掉看门狗
  • Python读取超时(Read timed out.)

    HTTPConnectionPool host XXXXXXXX port xxxx Read timed out XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Read timed out 解决方案 pip3 de
  • 编程语言python入门要电脑什么配置能带动-Python是万能的编程语言吗?这五大用途很重要!...

    这个真的不好说 因为Python可以做的事情有很多 用途也是非常广泛的 尤其是在以下领域中更具有作用 1 web开发 Python是一种解释型的脚本语言 开发效率高 所以非常适合用来做web开发 Python有上百种web开发框架 有很多成
  • 【ML on Kubernetes】第 1 章:机器学习的挑战

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • aps是什么意思_aps画幅是什么意思

    APS的原意是指 高级摄影系统 Advanced Photo System 是数码相机普及前的一种过渡产品 它仍使用胶卷 但在胶卷和暗盒上通过磁性材料和数字计划 记录了很多相关数据 还有一个特点就是APS允许用户随时在三种画幅格式切换 它们
  • 特征融合方法

    概述 基本概念 在很多工作中 融合不同尺度的特征是提高分割性能的一个重要手段 低层特征分辨率更高 包含更多位置 细节信息 但是由于经过的卷积更少 其语义性更低 噪声更多 高层特征具有更强的语义信息 但是分辨率很低 对细节的感知能力较差 如何
  • MyBatis PostgreSQL实现数组类型的操作

    我的GitHub Powerveil GitHub 我的Gitee Powercs12 powercs12 Gitee com 皮卡丘每天学Java 最近在学习数据库PostgreSQL 遇到如何实现对数组类型的数据操作 试着自己尝试学习实
  • UE5关于高亮显示物体轮廓线

    描边材质如果是透明的话 不会显示描边 材质参数勾选 允许自定义深度写入 即可 材质参考这个文章 https blog csdn net Axiang 0123 article details 121168272 ops request mi
  • 多标签分类怎么做?教你4招

    首先简单介绍下 多标签分类与多分类 多任务学习的关系 多分类学习 Multi class 分类器去划分的类别是多个的 但对于每一个样本只能有一个类别 类别间是互斥的 例如 分类器判断这只动物是猫 狗 猪 每个样本只能有一种类别 就是一个三分
  • iview表格单元格动态绑定class/style,不刷新表格本身.

    对订单表格的时间列 动态检验时间是否过期并用颜色标记 关键点是在render中的渲染函数动态绑定class style 小问题是表格数据本身是确定的不再变化 我们又需要跟随时间变化 所以首选需要一个定时器 定时器不能放在表格里会导致计时器不
  • 我的第一个小爬虫程序-python

    爬什么 爬代理服务器网站的服务器 端口 代理种类 所在地区 更新日期 今日评分 总的评分 可用 速度测评信息 这样的网页有七八个 好在网址明名很规则 具体说就是爬很多的这样的html代码里的信息 span class tbBottomLin
  • 【论文】AMC:AutoML用于移动设备上的模型压缩和加速

    摘要 模型压缩是在计算资源有限且功率预算紧张的移动设备上高效部署神经网络模型的有效技术 传统的模型压缩技术依赖于手工制作的特性 需要领域专家在模型大小 速度和精度之间进行权衡 以探索大的设计空间 这通常是次优和耗时的 在本文中 我们提出了用
  • 不想安装环境,我如何与前端工程师远程协作开发?

    最近我的一名前端工程师朋友Wendy正基于自己的想法开发一个开源项目 为了让用户了解并试用项目 她准备用Nextjs这个前端框架搭建一个用户使用手册网站 写文档的时候 她想到了我这个产品经理朋友 希望我能够帮助她一起开发这个网站 提供更好的
  • 【Qt/C++异常笔记】“QHostInfo”: 不是类或命名空间名称

    文章目录 异常描述 异常原因 解决方法 开发环境 异常描述 在读取主机名称时 需要用到 QHostInfo localHostName 但是使用了之后一直报错 QHostInfo 不是类或命名空间名称 头文件中引用 include
  • 《数据结构与算法》实验:图结构的建立与搜索

    数据结构与算法 实验和课程Github资源 数据结构与算法 实验 线性结构及其应用 算术表达式求值 数据结构与算法 实验 树型结构的建立与遍历 数据结构与算法 实验 图结构的建立与搜索 数据结构与算法 实验 查找结构的实验比较 二叉查找树B
  • 图的m着色问题(第十二次实验)

    图的m着色问题 问题 图的m着色问题 给定无向连通图G和m种颜色 用这些颜色给图的顶点着色 每个顶点一种颜色 如果要求G的每条边的两个顶点着不同颜色 给出所有可能的着色方案 如果不存在 则回答 NO 解析 图着色问题描述为 给定无向连通图G
  • Qt开发之QTableWidget

    QTableWidget从继承QTableView 实质属于模型 视图范畴之内 只是带了默认模型 model 基于项目 item 的表格视图控件 我们不需要实现model内的数据加工 QTableWidget为应用程序提供了标准的表显示工具