qt table 简易封装,样式美化,以及 合并表格和颜色的区分 已解决

在需求中, 难免会使用 table 进行渲染窗口,做一个简单的封装。美化表格最终效果!!!

        

代码部分

	// 显示 20行 20列CCendDetailsInfoTableWidget* table = new CCendDetailsInfoTableWidget(20,10);for (int i = 0; i < 20; i++){for (int j = 0; j < 10; j++){table->setCellText(i, j,QString::number(i * 10 + j));}}//显示行号列QHeaderView* headerView = table->verticalHeader();headerView->setHidden(true); //false 显示行号列  true HideQHeaderView* horizontalView = table->horizontalHeader();horizontalView->setHidden(true); //false 显示行号列  true Hidetable->setSelectionBehavior(QAbstractItemView::SelectRows);//选中的时候选中一行table->setSelectionMode(QAbstractItemView::SingleSelection);//只能选中单个目标table->setEditTriggers(QAbstractItemView::NoEditTriggers);//不能对表格内容进行修改table->setStyleSheet("QTableWidget{background:transparent; gridline-color:rgba(9, 107, 163, 100);color:#FFF;}"//"QTableWidget::Item{border:1px solid rgba(9, 107, 163, 1);border-bottom:1px solid rgba(9, 107, 163, 1);color: #FFFFFF;}""QTableWidget::Item:selected{background:transparent;color:rgba(4, 218, 255, 1);}");// 每一行点击connect(table, &QTableWidget::itemDoubleClicked, this, [&]() {qDebug() << "click";});QWidget* widget = new QWidget; widget->setStyleSheet("QWidget{border-image: url(:/images/Resource/image/CCendDetailsWidget/Legendbg1px.png);background-repeat:repeat-y; background-size:100% 1px;}");QHBoxLayout* layout = new QHBoxLayout(widget);layout->setContentsMargins(0, 0, 0, 0);layout->addWidget(table);

表格部分

#ifndef C_CEND_TABLE_DETAILS_INFO_TABLE_WIDGET_H
#define C_CEND_TABLE_DETAILS_INFO_TABLE_WIDGET_H#include <QWidget>
#include <QFile>
#include <QDebug>
#include <QMouseEvent>
#include <QAxWidget>
#include <QPushButton>
#include <QTextCodec>
#include <QGuiApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonValue>
#include <Qjsonobject>
#include <Qlabel>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QHeaderView>
#include <QtCore>
#include <QtGui>
#include <QLabel>#ifdef WIN32
#pragma execution_character_set("utf-8")
#endifclass CCendDetailsInfoTableWidget : public QTableWidget
{Q_OBJECTpublic://构造函数,无实际内容,直接调用的构造函数CCendDetailsInfoTableWidget(QWidget *parent = 0) : QTableWidget(parent) { }// 析构函数CCendDetailsInfoTableWidget(int row, int column, QWidget *parent = 0): QTableWidget(row, column, parent) { }//设置某个单元格中的文字void setCellText( int cx, int cy, const QString &text, int alignment = Qt::AlignLeft, const QIcon icon = QIcon() );//在某个单元格中放置一张小图片void setCellPixmap(int cx, int cy, const QPixmap &pixmap,Qt::Alignment alignment = Qt::AlignCenter);//获取某个单元格中的字符串(如果没有,就返回一个空字符串)QString getCellText(int cx, int cy);//获取某个单元格的图片(如果没有,就返回一张空图片)QPixmap getCellPixmap(int cx, int cy);
};#endif // C_CEND_TABLE_DETAILS_INFO_TABLE_WIDGET_H

 cpp

#include "CCendDetailsInfoTableWidget.h"void CCendDetailsInfoTableWidget::setCellText(int cx, int cy, const QString &text, int alignment, const QIcon icon)
{//检查是否越界if( cx>=rowCount() || cy>=columnCount() ){qDebug() << "Fail, Out of Range";return;}//如果此单元格中已经有item了,就直接更改item中的内容//否则,新建一个itemQTableWidgetItem *titem = item(cx, cy);if( NULL == titem )titem = new QTableWidgetItem;titem->setText(text);titem->setTextAlignment(Qt::AlignCenter);//如果图标不为空,就为此item设置图标if( !icon.isNull() )titem->setIcon(icon);setItem(cx, cy, titem);
}void CCendDetailsInfoTableWidget::setCellPixmap(int cx, int cy, const QPixmap &pixmap,Qt::Alignment alignment)
{if( cx>=rowCount() || cy>=columnCount() ){qDebug() << "Fail, Out of Range";return;}//在item中设置图片有很多方法,但我还是觉得在其中放置带图片一个Label最简单QLabel *label = new QLabel(this);label->setAlignment(alignment);label->setPixmap(pixmap);setCellWidget(cx, cy, label);
}QString CCendDetailsInfoTableWidget::getCellText(int cx, int cy)
{QString result;if( cx>=rowCount() || cy>=columnCount() ){qDebug() << "Fail, Out of Range";return result;}QTableWidgetItem *titem = item(cx, cy);if( NULL != titem ){result = titem->text();}return result;
}QPixmap CCendDetailsInfoTableWidget::getCellPixmap(int cx, int cy)
{QPixmap result;if( cx>=rowCount() || cy>=columnCount() ){qDebug() << "Fail, Out of Range";return result;}QTableWidgetItem *titem = item(cx, cy);if( NULL == titem )return result;QLabel *label = dynamic_cast<QLabel*>( cellWidget(cx, cy) );result = label->pixmap();return result;
}

qss部分 

CCendDetailsInfoWidget QWidget#mainWidget
{background: transparent;
}CCendDetailsInfoWidget QWidget#headTopWidget
{border-image: url(":/images/Resource/image/CCendDetailsInfoWidget/headTopBg.png");
}CCendDetailsInfoWidget QPushButton#closeBtn
{border-image: url(":/images/Resource/image/searchListWidget/close.png");
}CCendDetailsInfoWidget QWidget#bodyWidget
{/*border-image: url(":/images/Resource/image/CCendDetailsWidget/Legendbg1px.png");   */background-repeat: repeat-y; /* 使水平方向重复 */background-size: 100% 1px; /* 宽度100%,高度1px */
}CCendDetailsInfoWidget  QLabel#label
{color: #ffffff;font-size: 16px;font-bold: 10px;text-align: center;
}/*滚动条*/
QScrollBar:horizontal
{border: none;border-radius: 2px;width: 4px;background-color: rgba(211, 226, 226, 100);margin: 2px 0 2px 0;
}QScrollBar::handle:horizontal
{border: none;border-radius: 2px;background-color: rgba(13, 133, 255, 51);width: 40px;margin: 0 0 0 0;subcontrol-position: bottom;subcontrol-origin: margin;
}QScrollBar:vertical
{border: none;border-radius: 2px;width: 4px;background-color: rgba(211, 226, 226, 100);margin: 2px 0 2px 0;
}QScrollBar::handle:vertical
{border: none;border-radius: 2px;background-color: rgba(13, 133, 255, 51);height: 40px;margin: 0 0 0 0;subcontrol-position: bottom;subcontrol-origin: margin;
}QTableWidget
{color:white;gridline-color: #096BA3;  //网格线border: 1px solid #096BA3;
}QTableWidget::item
{color:white;background:transparent;border: 1px solid #096BA3;
}
QTableWidget::item::selected
{color:white;background:transparent;
}
QTableWidget QScrollBar::vertical
{background:transparent;border:1 solid #096BA3;border-radius:8px;
}
QTableWidget QScrollBar::handle
{border-radius:6px;background:transparent;min-height:50px;
}
QTableWidget QScrollBar::add-line,QTableWidget QScrollBar::sub-line{border:none;}
QTableWidget QScrollBar::add-page,QTableWidget QScrollBar::sub-page{border:#0c161e;border-radius:10px;}

合并表格版本

json代码

[{"row": "12","column": "4","width":"100","table": [[ {"name": "取水水源名称","span": "0,1,1,1","align": "2","color": "255,255,255"},{"name": "河川水库","span": "0,1,1,3","align": "2","color": "4,218,255"}],[{"name": "河川水库","span": "1,1,1,1","align": "2","color": "255,255,255"},{"name": "河川水库","span": "1,1,1,3","align": "2","color": "4,218,255"}],[{"name": "河川水库","span": "2,1,1,1","align": "2","color": "255,255,255"},{"name": "河川水库","span": "2,1,1,3","align": "2","color": "4,218,255"}],[{"name": "河川水库","span": "3,1,1,1","align": "2","color": "255,255,255"},{"name": "河川水库","span": "3,1,1,3","align": "2","color": "4,218,255"}],[{"name": "河川水库","span": "4,1,1,1","align": "2","color": "255,255,255"},{"name": "河川水库","span": "4,1,1,3","align": "2","color": "4,218,255"}],[{"name": "河川水库","span": "5,1,1,1","align": "2","color": "255,255,255"},{"name": "河川水库","span": "5,1,1,3","align": "2","color": "4,218,255"}],[{"name": "河川水库","span": "6,1,1,1","align": "2","color": "255,255,255"},{"name": "河川水库","span": "6,1,1,3","align": "2","color": "4,218,255"}],[{"name": "设计饮水量","span": "7,1,1,1","align": "2","color": "255,255,255"},{"name": "设计饮水量","span": "7,1,1,1","align": "2","color": "255,255,255"},{"name": "设计饮水量","span": "7,1,1,1","align": "2","color": "255,255,255"},{"name": "设计饮水量","span": "7,1,1,1","align": "2","color": "255,255,255"}],[{"name": "17.0","span": "8,1,1,1","align": "2","color": "4,218,255"},{"name": "17.0","span": "8,1,1,1","align": "2","color": "4,218,255"},{"name": "17.0","span": "8,1,1,1","align": "2","color": "4,218,255"},{"name": "17.0","span": "8,1,1,1","align": "2","color": "4,218,255"}],[{"name": "输水干线上建筑物数量(处)","span": "9,0,1,4","align": "2","color": "255,255,255"}],[{"name": "水闸","span": "10,1,1,1","align": "2","color": "255,255,255"},{"name": "水闸","span": "10,1,1,1","align": "2","color": "255,255,255"},{"name": "水闸","span": "10,1,1,1","align": "2","color": "255,255,255"},{"name": "水闸","span": "10,1,1,1","align": "2","color": "255,255,255"}],[{"name": "17.0","span": "11,1,1,1","align": "2","color": "4,218,255"},{"name": "17.0","span": "11,1,1,1","align": "2","color": "4,218,255"},{"name": "17.0","span": "11,1,1,1","align": "2","color": "4,218,255"},{"name": "18.0","span": "11,1,1,1","align": "2","color": "4,218,255"}]]
}]

实现代码

void  CCendDetailsInfoWidget::initTableStyle(QTableWidget* table)
{//显示行号列table->horizontalHeader()->setVisible(false); // 隐藏行表头table->verticalHeader()->setVisible(false);   // 隐藏列表头table->setSelectionBehavior(QAbstractItemView::SelectRows);//选中的时候选中一行table->setSelectionMode(QAbstractItemView::SingleSelection);//只能选中单个目标table->setEditTriggers(QAbstractItemView::NoEditTriggers);//不能对表格内容进行修改//表列随着表格变化而自适应变化table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//表行随着表格变化而自适应变化table->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);table->setStyleSheet("QTableWidget{background:transparent; gridline-color:rgba(9, 107, 163, 100);color:#FFF;}""QTableWidget::Item:selected{background:transparent;color:rgba(4, 218, 255, 1);}");// 每一行点击connect(table, &QTableWidget::itemDoubleClicked, this, [&]() {qDebug() << "click";});QWidget* widget = new QWidget;widget->setStyleSheet("QWidget{border-image: url(:/images/Resource/image/CCendDetailsWidget/Legendbg1px.png);background-repeat:repeat-y; background-size:100% 1px;border-radius:5px;}");QHBoxLayout* layout = new QHBoxLayout(widget);layout->setContentsMargins(0, 0, 0, 0);layout->addWidget(table);ui->bodyWidget->layout()->addWidget(widget);
}void CCendDetailsInfoWidget::initJsonData()
{// 列表配置文件QJsonArray listJsonArray = getCfgJsonData("details_info_table_config.json");if (listJsonArray.isEmpty()){return;}int row = listJsonArray.at(0).toObject().value("row").toString().toInt();int column = listJsonArray.at(0).toObject().value("column").toString().toInt();int width = listJsonArray.at(0).toObject().value("width").toString().toInt();QJsonArray tableJsonArray = listJsonArray.at(0).toObject().value("table").toArray();CCendDetailsInfoTableWidget* table = new CCendDetailsInfoTableWidget(row, column);for (int i = 0; i < tableJsonArray.size(); ++i){QJsonArray jsonArray = tableJsonArray.at(i).toArray();for (int j = 0; j < jsonArray.size(); j++){QJsonValue jsonValue = jsonArray.at(j);QString name = jsonValue.toObject().value("name").toString();QStringList color = jsonValue.toObject().value("color").toString().split(",");QStringList span = jsonValue.toObject().value("span").toString().split(",");int align = jsonValue.toObject().value("align").toString().toInt();int alignment;if (align == 1){alignment = Qt::AlignLeft;}else if (align == 2){alignment = Qt::AlignCenter;}else {alignment = Qt::AlignRight;}table->setCellText(i, j, name, QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()), alignment);table->setSpan(span[0].toInt(), span[1].toInt(), span[2].toInt(), span[3].toInt());}}initTableStyle(table);
}

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

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

相关文章

基于Springboot Vue医院管理系统+数据库脚本+文档(万字)

项目效果视频: 基于Springboot Vue医院管理系统 一、 项目介绍 角色&#xff1a;管理员、患者、医生 基于springboot vue实现的医院管理系统&#xff0c;有管理员、医生和患者三种角色。系统拥有丰富的功能&#xff0c;能够满足各类用户的需求&#xff0c;系统提供了登录和注册…

[Qt学习笔记]Qt实现自定义控件SwitchButton开关按钮

1、功能介绍 在项目UI中使用较多的打开/关闭的开关按钮&#xff0c;一般都是找图片去做效果&#xff0c;比如说如下的图像来表征打开或关闭。 如果想要控件有打开/关闭的动画效果或比较好的视觉效果&#xff0c;这里就可以使用自定义控件&#xff0c;使用Painter来绘制控件。软…

001-Windows下PyTorch极简开发环境配置

本节介绍Windows系统下配置一套基于Pytorch框架的极简深度学习开发环境。 目录 0.1 缘起 0.2 准备 1.1 安装Anaconda 1.2 安装CUDA和cudnn &#xff08;1&#xff09;确定CUDA版本 &#xff08;2&#xff09;安装CUDA &#xff08;3&#xff09;安装cudnn 1.3 安装Pyt…

论文阅读--临床驱动的多标签医学图像分类中的三元组注意力与双池对比学习---TA-DCL

来源&#xff1a;https://github.com/ZhangYH0502/TA-DCL. 模型结合了两种技术&#xff1a;三元组注意力&#xff08;Triplet attention&#xff09;和双池对比学习&#xff08;Dual-pool contrastive learning&#xff09;。这个模型是为了解决临床应用中多标签医学图像分类问…

中等职业学校大数据课程建设方案

大数据产业是以数据及数据所蕴含的信息价值为核心生产要素&#xff0c;通过数据技术、数据产品、数据服务等形式&#xff0c;使数据与信息价值在各行业经济活动中得到充分释放的赋能型产业。 大数据产业定义一般分为核心业态、关联业态、衍生业态三大业态。 一、专…

C语言 青蛙跳台阶问题

目录 ​编辑 1.问题描述 2.问题分析 3.全部代码 4.结语 1.问题描述 一只青蛙可以一次跳一级台阶&#xff0c;也可以一次跳两级台阶&#xff0c;如果青蛙要跳上n级台阶有多少种跳法&#xff1f; 2.问题分析 当台阶只有一级时&#xff0c;只能跳一级&#xff0c;所以只有一…

2015年认证杯SPSSPRO杯数学建模D题(第一阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现&#xff1a; 城市交通问题直接影响市民的生活和工作。在地形平坦的城市&#xff0c;公共自行车出行系统是一种很好的辅助手段。一般来说&#xff0c;公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

VR全景为中小型企业发展带来了什么优势?

有研究数据表明&#xff0c;今年前期中小型企业发展活力得以持续释放&#xff0c;在促进经济增长、稳定就业等方面发挥了重要作用。而在有关政策的支持下&#xff0c;加上各大媒体和具有影响力的企业带动下&#xff0c;VR全景凭借其新颖的展示方式备受瞩目。 那么VR全景为中小型…

微信小程序实战:无痛集成腾讯地图服务

在移动互联网时代,地图服务无疑是应用程序中最常见也最实用的功能之一。无论是导航定位、附近搜索还是路线规划,地图服务都能为用户提供极大的便利。在微信小程序开发中,我们可以轻松集成腾讯地图服务,为小程序赋能增值体验。本文将详细介绍如何在微信小程序中集成使用腾讯地图…

启明智显Model4芯片应用于电自、电摩两轮车彩屏仪表解决方案

电自、电摩两轮车彩屏仪表方案应用背景&#xff1a; 电自、电摩两轮车行业的快速发展和消费者对车辆信息显示需求的提升&#xff0c;以及TFT彩屏技术的不断成熟和智能化趋势的推动&#xff0c;主要表现在以下几点&#xff1a; 一、随着电动自行车和电动摩托车市场的快速发展&…

Mybatis-核心配置文件 / Mybatis增删改查

1. 核心配置文件 1.1. 概述 核心配置文件是MyBatis框架中用于集中定义全局配置信息的XML文件&#xff0c;其内部包含了一系列预设标签&#xff0c;用于设置数据库连接、对象映射、类型处理等关键参数。这些标签遵循特定的排列顺序&#xff0c;尽管并非所有标签都是强制性的&a…

Div2 D. Effects of Anti Pimples

解题思路 将由小到大排序若不考虑绿色的情况则为最大值的情况为&#xff0c;即选择在它之前的点对于同时选,会被统计贡献时考虑考虑绿色&#xff0c;对于每个&#xff0c;若选则均选对于每个预处理出&#xff0c;记作对由小到大排序为答案的情况为 …