前面三个事例,实现了一个2行3列的table,我们发现table的每列自动给加上了标题1、2、3;
那我们如何自定义标题呢?其实很简单,只需要增加实现mode的headerData()虚函数:
QVariant headerData(int section, Qt::Orientation orientation, int role);
默认是调用父类的headerData()函数进行了标题设置,可以通过tableView->verticalHeader()->hide()的方式进行隐藏。
mymode.h增加headerData()函数
#include <QAbstractTableModel>
class MyModel : public QAbstractTableModel
{
Q_OBJECT
public:
MyModel(QObject *parent);
int rowCount(const QModelIndex &parent = QModelIndex()) const override ;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
};
mymode.cpp
#include "mymodel.h"
MyModel::MyModel(QObject *parent)
:QAbstractTableModel(parent)
{
}
//-------------------------------------------------------
int MyModel::rowCount(const QModelIndex & /*parent*/) const
{
return 2;
}
//-------------------------------------------------------
int MyModel::columnCount(const QModelIndex & /*parent*/) const
{
return 3;
}
//-------------------------------------------------------
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole)
{
return QString("Row%1, Column%2")
.arg(index.row() + 1)
.arg(index.column() +1);
}
return QVariant();
}
//! [quoting mymodel_c]
QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole)
{
if (orientation == Qt::Horizontal) {
switch (section)
{
case 0:
return QString("first");
case 1:
return QString("second");
case 2:
return QString("third");
}
}
}
return QVariant();
}
//! [quoting mymodel_c]
这里我们只关注headerData()函数。
参数Qt::Orientation只有两个取值:Qt::Horizontal 0x1 控制水平和垂直;
Qt::Vertical 0x2
section是标识第几行或第几列;比如本例就是控制在水平方向上第0、1、2列进行设置。
运行结果如下: