Qt之多行表头控件

多行表头

Qt不提供默认的多行表头控件, 网上大多也是用2个QTableWidget组合来实现,最近在网上看到一份资源。他的思路是使用Model/View,通过使用重载来实现,我觉得很有学习借鉴的价值。所以在这分享。

效果

在这里插入图片描述

逻辑

  • RbTableHeaderItem:它负责保存每个项目的信息,主要是除了标签之外的行数和列宽。
  • RbTableHeaderModel:模型类,提供对每个项目的访问,以便我们可以编辑和读取每个项目
  • RbTableHeaderView:此类是自定义QHeaderView主要方法被覆盖以获得所需外观的自定义。

使用

由于代码过多,在这里就不详细展示了。只贴出使用方法。 有能力的同学也可以在封装成TableWidget

RbTableHeaderView* hHead = new RbTableHeaderView(Qt::Horizontal, 2, 3);
RbTableHeaderView* vHead = new RbTableHeaderView(Qt::Vertical, 3, 2);
QAbstractItemModel* hModel = hHead->model();
QAbstractItemModel* vModel = vHead->model();
QStandardItemModel* dataModel = new QStandardItemModel;

hHead->setSpan(0, 0, 2, 1);
hHead->setSpan(0, 1, 1, 2);
hHead->setSpan(1, 1, 1, 1);
hHead->setSpan(1, 2, 1, 1);
hModel->setData(hModel->index(0, 0), QString("cell1"), Qt::DisplayRole);
hModel->setData(hModel->index(0, 1), QString("cell2"), Qt::DisplayRole);
hModel->setData(hModel->index(1, 1), QString("cell3"), Qt::DisplayRole);
hModel->setData(hModel->index(1, 2), QString("cell4"), Qt::DisplayRole);

vHead->setSpan(0, 0, 1, 2);
vHead->setSpan(1, 0, 2, 1);
vHead->setSpan(1, 1, 1, 1);
vHead->setSpan(2, 1, 1, 1);
vModel->setData(vModel->index(0, 0), QString("cell1"), Qt::DisplayRole);
vModel->setData(vModel->index(1, 0), QString("cell2"), Qt::DisplayRole);
vModel->setData(vModel->index(1, 1), QString("cell3"), Qt::DisplayRole);
vModel->setData(vModel->index(2, 1), QString("cell4"), Qt::DisplayRole);

hHead->setSectionsClickable(true);
vHead->setSectionsClickable(true);

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

view = new QTableView();

view->resize(800, 600);
view->setModel(dataModel);
view->setHorizontalHeader(hHead);
view->setVerticalHeader(vHead);

view->show();

资源

原有来源 存在几个Qt版本升级所导致的bug
优快云 下载不了的同学可以私信我

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值