Qt之多行表头控件

文章目录

  • 多行表头
  • 效果
  • 逻辑
  • 使用
  • 资源

多行表头

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

效果

Qt之多行表头控件_第1张图片

逻辑

  • 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 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
CSDN 下载不了的同学可以私信我

你可能感兴趣的:(Qt,C++,资料转载)