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

news2024/9/20 6:04:19

在需求中, 难免会使用 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 Hide
	QHeaderView* horizontalView = table->horizontalHeader();
	horizontalView->setHidden(true); //false 显示行号列  true Hide

	table->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")
#endif
 
class CCendDetailsInfoTableWidget : public QTableWidget
{
	Q_OBJECT

public:
	//构造函数,无实际内容,直接调用的构造函数
	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中的内容
	//否则,新建一个item
	QTableWidgetItem *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.coloradmin.cn/o/1544787.html

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

相关文章

ESCTF-逆向赛题WP

ESCTF_reverse题解 逆吧腻吧babypybabypolyreeasy_rere1你是个好孩子完结撒花 Q_W_Q 逆吧腻吧 下载副本后无壳&#xff0c;直接拖入ida分析分析函数逻辑&#xff1a;ida打开如下&#xff1a;提取出全局变量res的数据后&#xff0c;编写异或脚本进行解密&#xff1a; a[0xBF, …

enscan自动化主域名信息收集

enscan下载 Releases wgpsec/ENScan_GO (github.com) 能查的分类 实操&#xff1a; 首先打开linux 的虚拟机、 然后把下面这个粘贴到虚拟机中 解压后打开命令行 初始化 ./enscan-0.0.16-linux-amd64 -v 命令参数如下 oppo信息收集 运行下面代码时 先去配置文件把coo…

JavaEE企业开发新技术3

目录 2.11 Method的基本操作-1 文字性概念描述 代码&#xff1a; 2.12 Method的基本操作-2 2.13 Method的基本操作-3 2.14 数组的反射操作-1 文字性概念&#xff1a; 代码&#xff1a; 2.15 数组的反射操作-2 学习内容 2.11 Method的基本操作-1 文字性概念描述 Me…

io的学习4

打印流 分类&#xff1a;打印流一般是指&#xff1a;PrintStream、PrintWriter两个类 特点&#xff1a; 1.打印流只操作文件目的地&#xff0c;不操作数据源 2.特有的写出方法可以实现&#xff0c;数据原样写出 3.特有的写出方法&#xff0c;可以实现自动刷新&#xff0c;…

仅用一个月,游卡完成从MySQL到上线OceanBase的实践

编者按&#xff1a;自2023年9月起&#xff0c;游卡——国内最早卡牌游戏研发者之一&#xff0c;开始测试OceanBase&#xff0c;并在短短两个月内成功将三个核心业务应用迁移至OceanBase上。究竟是何因素促使游卡放弃游戏行业普遍采用的MySQL方案&#xff0c;转而大胆选择OceanB…

荟萃分析R Meta-Analyses 3 Effect Sizes

总结 效应量是荟萃分析的基石。为了进行荟萃分析&#xff0c;我们至少需要估计效应大小及其标准误差。 效应大小的标准误差代表研究对效应估计的精确程度。荟萃分析以更高的精度和更高的权重给出效应量&#xff0c;因为它们可以更好地估计真实效应。 我们可以在荟萃分析中使用…

一文整合工厂模式、模板模式、策略模式

为什么使用设计模式 今天终于有时间系统的整理一下这几个设计模式了&#xff0c; 这几个真是最常用的&#xff0c;用好了它们&#xff0c;你就在也不用一大堆的if else 了。能更好的处理大量的代码冗余问题。 在我们的实际开发中&#xff0c;肯定会有这样的场景&#xff1a;我…

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…

Qt与编码

ASCII码:一个字节&#xff0c;256个字符。 Unicode:字母&#xff0c;汉字都占用两个字节。 utf-8:字母一个字节&#xff0c;汉字3个字节。 gbk:字母一个字节&#xff0c;汉字2个字节。 gb2312:可以表示汉字&#xff0c;gb2312<gbk。 编码查看&#xff1a; https://www.…

钡铼技术R40路由器助力构建无人值守的智能化污水处理厂

钡铼技术R40路由器作为智能化污水处理厂的关键网络设备&#xff0c;发挥着至关重要的作用&#xff0c;助力构建无人值守的智能化污水处理系统。在现代社会&#xff0c;污水处理是城市环境保护和可持续发展的重要组成部分&#xff0c;而智能化污水处理厂借助先进的技术和设备&am…

C语言数据结构易错知识点(5)(插入排序、选择排序)

插入排序&#xff1a;直接插入排序、希尔排序 选择排序&#xff1a;直接选择排序、堆排序 上述排序都是需要掌握的&#xff0c;但原理不会讲解&#xff0c;网上有很多详尽地解释&#xff0c;本文章主要分享一下代码实现上应当注意的事项 1.直接插入排序&#xff1a; 代码实…

Kevin的128纪念日

上面这个是我在三天前做的一个开场白一样的封面。在设计的时候我的想法很简单&#xff0c;把自己给展现出来。我没有去过多的加其他花花绿绿的东西&#xff0c;我想把我本身的状态和形象给凸显出来。 哈哈~看到这里有人就想问&#xff0c;这个躺在沙发上吃零食的懒猫就是你的个…

利用瑞士军刀netcat建立连接并实现文件上传

实验环境&#xff1a; Kali:192.168.117.129 Windows10:192.168.135.142 第一步&#xff1a;建立连接 在Windows上下载netcat(官网搜索) 下载好之后在netcat目录打开cmd进入小黑屏 实验一&#xff1a;建立虚拟机与主机的连接 命令&#xff1a; Kali:nc 192.168.135.144…

FastAPI+React全栈开发05 React前端框架概述

Chapter01 Web Development and the FARM Stack 05 The frontend React FastAPIReact全栈开发05 React前端框架概述 Let’s start with a bit of context here. Perhaps the changes in the world of the web are most visible when we talk about the frontend, the part o…

前端学习之css基本网格布局

网格布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网格布局</title><style>.a{/* grid网格布局 */display: grid;width: 400px;height: 400px;border: 1px solid red;/* 设置当前…

【Spring】IoCDI详解

1. IoC详解 前面提到过IoC就是将对象的控制权交由Spring的IoC容器进行管理&#xff0c;由Spring的IoC容器创建和销毁bean&#xff0c;那么既然涉及到容器&#xff0c;就一定包含以下两方面功能&#xff1a; bean的存储bean的获取 1.1 类注解 Spring框架为了更好地服务应用程…

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能

RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能 文章目录 RabbitMQ3.x之二_RabbitMQ所有端口说明及开启后台管理功能1. RabbitMQ端口说明2. 开启Rabbitmq后台管理功能1. 查看rabbitmq已安装的插件2. 开启rabbitmq后台管理平台插件3. 开启插件后&#xff0c;再次查看插…

学习笔记Day15:Shell脚本编程

Shell脚本编程 Linux系统环境 Linux系统的4个主要部分&#xff1a;内核、shell、文件系统和应用程序。 内核是操作系统的核心&#xff0c;决定系统性能和稳定性shell &#xff1a;一种应用程序&#xff0c;是用户和内核交互操作的接口&#xff0c;是套在内核外的壳&#xff…

Linux文件IO(2):使用标准IO进行文件的打开、关闭、读写、流定位等相关操作

目录 前言 文件的打开和关闭的概念 文件的打开 文件的打开函数 文件打开的模式 文件的关闭 文件的关闭函数 注意事项 字符的输入&#xff08;读单个字符&#xff09; 字符输入的函数 注意事项 字符的输出&#xff08;写单个字符&#xff09; 字符输出的函数 注意…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中&#xff0c;我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中&#xff0c;使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库&#xff0c;旨在通过…