有趣的是 -文档指出这是一个虚拟方法:
virtual QVariant headerData(int section, Qt::Orientationorientation, int role) const
(...)
QVariant QAbstractProxyModel::headerData(int section, Qt::Orientationorientation, int role) const [虚拟]
从 QAbstractItemModel::headerData() 重新实现。
但在实际标题virtual
中缺少关键字:
C:\Qt\Qt5.2.1\5.2.1\msvc2010\include\QtCore\qabstractproxymodel.h
(...)
QVariant data(const QModelIndex &proxyIndex, int role = Qt::DisplayRole) const; //line76
QVariant headerData(int section, Qt::Orientation orientation, int role) const; //line77
我检查了正常的 Qt 目录,它也不见了:
C:\Qt\Qt5.2.1\5.2.1\Src\qtbase\src\corelib\itemmodels\qabstractproxymodel.h
(...)
QVariant data(const QModelIndex &proxyIndex, int role = Qt::DisplayRole) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
我做了一个测试:
sim = new QStandardItemModel (3,3);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++ ) {
sim->setData(sim->index(i,j), QString("%1%2").arg(QChar(j+65), QString().setNum(i+1)));
if (i==0)
sim->setHeaderData(j, Qt::Horizontal, QChar(j+65));
}
sim->setHeaderData(i, Qt::Vertical, i+1);
}
transposedModel = new TransposeProxyModel;
transposedModel->setSourceModel(sim);
QAbstractItemModel * aim = transposedModel;
QAbstractProxyModel *apm = transposedModel;
for (int i = 0; i < apm->rowCount(); i++) {
qDebug() << "aim->Qt::Vertical(" << i << ")" << aim->headerData(i, Qt::Vertical, Qt::DisplayRole);
qDebug() << "apm->Qt::Vertical(" << i << ")" << apm->headerData(i, Qt::Vertical, Qt::DisplayRole);
qDebug() << "transposedModel->Qt::Vertical(" << i << ")" << transposedModel->headerData(i, Qt::Vertical, Qt::DisplayRole);
}
调试是:
aim->Qt::Vertical( 0 ) QVariant(int, 1)
apm->Qt::Vertical( 0 ) QVariant(int, 1)
[ TransposeProxyModel::headerData ] //qDebug in TransposeProxyModel::headerData
transposedModel->Qt::Vertical( 0 ) QVariant(QChar, 'A')
aim->Qt::Vertical( 1 ) QVariant(int, 1)
apm->Qt::Vertical( 1 ) QVariant(int, 1)
[ TransposeProxyModel::headerData ] //qDebug in TransposeProxyModel::headerData
transposedModel->Qt::Vertical( 1 ) QVariant(QChar, 'B')
aim->Qt::Vertical( 2 ) QVariant(int, 1)
apm->Qt::Vertical( 2 ) QVariant(int, 1)
[ TransposeProxyModel::headerData ] //qDebug in TransposeProxyModel::headerData
transposedModel->Qt::Vertical( 2 ) QVariant(QChar, 'C')
所以我想这就是问题所在 - 该方法不是抽象的,这就是它不调用我的重写方法的原因。Qt 错误?还是故意的?我也看了一眼
C:\Qt\Qt5.2.1\5.2.1\Src\qtbase\src\corelib\itemmodels\qabstractproxymodel.cpp
/*!
\reimp
*/
QVariant QAbstractProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
Q_D(const QAbstractProxyModel);
int sourceSection;
if (orientation == Qt::Horizontal) {
const QModelIndex proxyIndex = index(0, section);
sourceSection = mapToSource(proxyIndex).column();
} else {
const QModelIndex proxyIndex = index(section, 0);
sourceSection = mapToSource(proxyIndex).row();
}
return d->model->headerData(sourceSection, orientation, role);
}
我想它应该得到正确的标题 - 它调用 mapToSource,它是纯虚拟的,这应该获得正确的索引?