Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

本文介绍如何在Qt中实现支持多级列表头、多级行表头、单元格合并及字体设置的表格控件。主要通过重写数据源QAbstractTableModel和表头QHeaderView实现,详细讲解了数据源、表头的定制以及设置属性的方法,提供了实现多级表头的思路和关键代码。
摘要由CSDN通过智能技术生成

一、概述

最近在研究QTableView支持多级表头的事情,百度了下网上资料还是挺多的。实现的方式总的来说有2种,效果都还不错,最主要是搞懂其中的原理,做到以不变应万变。

实现多级表头的方式有以下两种方案

  1. 行表头和列表头都是用一个表格去模拟
  2. 重写QHeadView

以上两种方式都可以实现多级表头,各有利弊,并且已经有人投入项目使用。

我个人还是比较偏向于第二种方式,因为这样我们才可以更好的了解Qt的底层,了解Qt的绘图机制,并且这样实现的效率也是比较高的,而且合理一些,比较可控(个人理解)。

后来我在网上找到了一个哥们写的控件,项目名字叫做RbTableHeaderView,挺不错的,可以实现我们要的功能,但是效果还是差一些,如果需要更友好的交互效果,那么还需要在继续完善这个demo。

今天闲来无事,找到了一个开源的网站,上边好多Qt的库,虽然有一些是很早以前的东西,但是也很值得我们去学习。为什么会提到这个网站呢?因为这个网站上就有我们要的这个多级表头事例,和上边提到的那个哥们的事例不谋而合。

想要学习更多开源事例的可以到openDesktop上去看看。

下面我们就来讲解这个多节表头的实现方式,代码比较简单,主要是大家理解下这个实现方式,可以加以扩展。

二、效果展示

多级表头的效果下图所示,很糙粗的一个demo,大家将就着看吧。

三、定制表头

定制表头我们主要是要重写2个东西,分别是数据源QAbstractTableModel和表头QHeaderView

1、重写数据源

数据源就是为视图提供数据的model,我们的所有显示的内容数据都来自这个model。

对于外部程序填充数据时和往常使用同样的方式

for (int i = 0; i < 10; i++)
{
	QList<QStandardItem*> items;
	for (int j = 0; j < 8; j++)
	{
		items.append(new QStandardItem(QString("item(%1, %2)").arg(i).arg(j)));
	}
	dataModel->appendRow(items);
}

重写了这个数据源后,我们主要是为了完成data的返回数据过程,View最关心的就是这个接口

class RbTableHeaderModel : public QAbstractTableModel
{
	Q_OBJECT

public:
	// override
	virtual QVariant data(const QModelIndex &index, int role) const;

private:
	// properties
	int row_count_prop;
	int column_count_prop;
	// inherent features
	RbTableHeaderItem* root_item;
};

下面就是data的函数实现,是不是大失所望,所有的额操作好像被封装到RbTableHeaderItem这个节点中去了。

QVariant RbTableHeaderModel::d
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值