Qt不提供默认的多行表头控件, 网上大多也是用2个QTableWidget组合来实现,最近在网上看到一份资源。他的思路是使用Model/View,通过使用重载来实现,我觉得很有学习借鉴的价值。所以在这分享。
由于代码过多,在这里就不详细展示了。只贴出使用方法。 有能力的同学也可以在封装成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 下载不了的同学可以私信我