多行表头
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();