#pragma execution_character_set("utf-8")
#include "CustomTableWidget.h"
#include <QHeaderView>
#include <QDebug>
#include <QTextOption>
#include <QPainter>
#include <QPushButton>
#include <QHBoxLayout>
#include <QScrollBar>
#include <QHeaderView>
#define HEADER_ROW_NUM 2
#define HEADER_COLUMN_NUM 15
#define HEADER_HEIGHT 23
#define ROWHEIGHT 30 //行高
C_CustomTableWidget::C_CustomTableWidget(QWidget *parent)
: QTableWidget(parent)
{
initTableWidgetHeaderFrozen();
initTableWidgetContent();
}
C_CustomTableWidget::~C_CustomTableWidget()
{
delete m_pTableWidgetHeaderFrozen;
}
void C_CustomTableWidget::initTableWidgetContent()
{
clearContents();
setColumnCount(HEADER_COLUMN_NUM);
horizontalHeader()->setVisible(true); // 水平表头可见
int headerHeight = m_pTableWidgetHeaderFrozen->rowHeight(0) +
m_pTableWidgetHeaderFrozen->rowHeight(1); // 设置成被m_pTableWidgetHeaderFrozen遮挡住
horizontalHeader()->setFixedHeight(headerHeight);
verticalHeader()->setVisible(false); // 表头不可见
// setShowGrid(false); // 网格线不可见
setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置单元格不可编辑
setSelectionMode(QAbstractItemView::SingleSelection); // 单选
setSelectionBehavior(QAbstractItemView::SelectRows); // 选择行
horizontalHeader()->setStretchLastSection(true); // 最后一个单元格扩展
setFocusPolicy(Qt::NoFocus); // 解决选中虚框问题
setFrameShape(QFrame::NoFrame); // 去除边框
setVerticalScrollMode(ScrollPerPixel);
setHorizontalScrollMode(ScrollPerPixel);
setItemDelegate(new ItemDelegate(1)); // 设置绘画代理(主要在代理中画出来header)
}
void C_CustomTableWidget::initTableWidgetHeaderFrozen()
{
m_pTableWidgetHeaderFrozen = new QTableWidget(this);
m_pTableWidgetHeaderFrozen->horizontalHeader()->setVisible(false); // 表头不可见
m_pTableWidgetHeaderFrozen->verticalHeader()->setVisible(false); // 表头不可见
m_pTableWidgetHeaderFrozen->setShowGrid(false); // 网格线不可见
m_pTableWidgetHeaderFrozen->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置单元格不可编辑
m_pTableWidgetHeaderFrozen->horizontalHeader()->setStretchLastSection(true); // 最后一个单元格扩展
m_pTableWidgetHeaderFrozen->setFocusPolicy(Qt::NoFocus); // 解决选中虚框问题
m_pTableWidgetHeaderFrozen->setFrameShape(QFrame::NoFrame); // 去除边框
m_pTableWidgetHeaderFrozen->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏滚动条
m_pTableWidgetHeaderFrozen->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //
m_pTableWidgetHeaderFrozen->setHorizontalScrollMode(ScrollPerPixel);
m_pTableWidgetHeaderFrozen->setItemDelegate(new ItemDelegate(0)); // 设置绘画代理(主要在代理中画出来header)
viewport()->stackUnder(m_pTableWidgetHeaderFrozen); // 设置窗口层次
m_pTableWidgetHeaderFrozen->setRowCount(HEADER_ROW_NUM); // header 2行
m_pTableWidgetHeaderFrozen->setColumnCount(HEADER_COLUMN_NUM); // header 15列
m_pTableWidgetHeaderFrozen->setRowHeight(0, HEADER_HEIGHT); // 第一行设置高度23px
m_pTableWidgetHeaderFrozen->setRowHeight(1, HEADER_HEIGHT); // 第二行设置高度23px
for (int nRow = 2; nRow < m_pTableWidgetHeaderFrozen->rowCount(); ++nRow) // 隐藏2行后的行
m_pTableWidgetHeaderFrozen->setRowHidden(nRow, true);
//===================设置header内容=================//
// 合并单元格
m_pTableWidgetHeaderFrozen->setSpan(0, 0, 2, 1); // 名称
m_pTableWidgetHeaderFrozen->setSpan(0, 1, 1, 6); // 11111
m_pTableWidgetHeaderFrozen->setSpan(0, 7, 1, 6); // 22222
m_pTableWidgetHeaderFrozen->setSpan(0, 13, 2, 1); // 33333
m_pTableWidgetHeaderFrozen->setSpan(0, 14, 2, 1); // 44444
// 设置表头内容
m_pTableWidgetHeaderFrozen->setItem(0, 0, new QTableWidgetItem("名称"));
m_pTableWidgetHeaderFrozen->setItem(0, 1, new QTableWidgetItem("11111"));
m_pTableWidgetHeaderFrozen->setItem(0, 7, new QTableWidgetItem("22222"));
m_pTableWidgetHeaderFrozen->setItem(0, 13, new QTableWidgetItem("33333"));
m_pTableWidgetHeaderFrozen->setItem(0, 14, new QTableWidgetItem("444444"));
QStringList slHeaderLabels;
slHeaderLabels << QString("1") << QString("2") << QString("3") << QString("4") << QString("5") << QString("6");
for(int i = 1; i < 7; ++i)
{
m_pTableWidgetHeaderFrozen->setItem(1, i, new QTableWidgetItem(slHeaderLabels.at(i-1)));
}
for(int i = 7; i < 13; ++i)
{
m_pTableWidgetHeaderFrozen->setItem(1, i, new QTableWidgetItem(slHeaderLabels.at(i-7)));
}
// 连接信号槽,用于滚动条联动
connect(m_pTableWidgetHeaderFrozen->verticalScrollBar(), &QAbstractSlider::valueChanged,
verticalScrollBar(), &QAbstractSlider::setValue);
connect(verticalScrollBar(), &QAbstractSlider::valueChanged,
m_pTableWidgetHeaderFrozen->verticalScrollBar(), &QAbstractSlider::setValue);
connect(horizontalScrollBar(), &QScrollBar::valueChanged, m_pTableWidgetHeaderFrozen->horizontalScrollBar(), &QScrollBar::setValue);
updateTableWidgetHeaderFrozenGeometry(); // 更新位置
m_pTableWidgetHeaderFrozen->show();
}
void C_CustomTableWidget::updateTableWidgetHeaderFrozenGeometry()
{
m_pTableWidgetHeaderFrozen->setGeometry(frameWidth(),
frameWidth(),
viewport()->width(),
horizontalHeader()->height());
}
void C_CustomTableWidget::resizeEvent(QResizeEvent *event)
{
QTableView::resizeEvent(event);
updateTableWidgetHeaderFrozenGeometry();
}
QModelIndex C_CustomTableWidget::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{
QModelIndex current = QTableView::moveCursor(cursorAction, modifiers);
if (cursorAction == MoveUp && current.row() > 0
&& visualRect(current).topLeft().y() < m_pTableWidgetHeaderFrozen->rowHeight(1) ){
const int newValue = verticalScrollBar()->value() + visualRect(current).topLeft().y()
- m_pTableWidgetHeaderFrozen->rowHeight(0) - m_pTableWidgetHeaderFrozen->rowHeight(1);
verticalScrollBar()->setValue(newValue);
}
return current;
}
void C_CustomTableWidget::scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint)
{
if (index.row() > 0)
QTableView::scrollTo(index, hint);
}
ItemDelegate::ItemDelegate(int type, QObject *parent)
: QStyledItemDelegate(parent),
m_type(type)
{
}
void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if(0 == m_type) //header tablewidget
{
int rowIndex = index.row(); // 行号
int colIndex = index.column(); // 列号
if (rowIndex == 0 || rowIndex == 1) // 前两行作为header
{
//背景
QColor color;
if (rowIndex == 0 && (colIndex == 0 || // 名称
colIndex == 13 || // 33333
colIndex == 14)) // 44444
{
color.setRgb(231, 238, 251);
}
else if ((rowIndex == 0 && colIndex == 1) || // 11111
(rowIndex == 1 && (colIndex == 1 || // 1
colIndex == 2 || // 2
colIndex == 3 || // 3
colIndex == 4 || // 4
colIndex == 5 || // 5
colIndex
“Qt”+“C++”+QTableWidget控件自定义表头,合并,重写样式
需积分: 0 65 浏览量
更新于2023-09-07
1
收藏 4KB RAR 举报
内容概要:QTableWidget自定义表头,占用多行数据,利用合并表格功能实现多行表头,使开发者能够根据需要灵活地定制表格外观和行为,内部已实现了自定义样式表头,可根据需求重新实现
使用人群:Qt/C++开发人员
使用场景:Qt项目开发
实现思想:使用两个表格进行实现,一个表格充当表头,一个表格隐藏表头,充当表格项
其他说明:可根据项目情况进行自定义实现

FreeLikeTheWind.
- 粉丝: 2182
最新资源
- 专业服装管理软件经销协议书.docx
- 儿童品牌-红孩子网络营销方案课件.ppt
- 机械制造与自动化生产的实习报告.docx
- 利用微信 hook 拦截修改特定 call 并嵌入 Python 代码爬取微信公众号文章
- 电子商务技术概述.doc
- 年软件开发个人工作总结.docx
- 协同办公自动化的五大好处.pdf
- 基于PLC的加热炉温度控制系统本科毕业设计.doc
- 互联网大学生创新创业大赛项目计划书.doc
- 数字通信SDH教案.pptx
- 京东商城网络营销策略.pptx
- 2023年计算机考试题模拟优质.doc
- 复旦大学《软件工程》钱乐秋课件教案PPT04.ppt
- 算法设计与分析第四版剖析.pptx
- 基于JSP的动态WEB学习系统的研究与实现论文.doc
- 计算机辅助创新技术在产品设计过程中的运用.docx