1

データベースから受け取ったテーブルを適切に転置するのに問題があります。私はここにあるパスをたどり、ここで説明されているような QAbstractProxyModel をサブクラス化することになりました。残念ながら、それは完全には機能しません。問題は次のとおりです。

私が持っているもの:

X | A  | B
----------
1 | A1 | B1
2 | A2 | B2

私が欲しいもの:

X | 1  | 2
----------
A | A1 | A2
B | B1 | B2

私が得るもの:

X | 1  | 1
----------
A | A1 | A2
A | B1 | B2

ご覧のとおり、データは正しく転置されていますが、ヘッダーは悪くなります...そして、私は本当にそれらが必要です:(

ヘッダー データを手動で設定しようとしましたが、失敗しました。

origModel = new QSqlQueryModel; // set query and so on
transposedModel = new TransposeProxyModel;
transposedModel->setSourceModel(origModel );
for (int i = 0; i < origModel->columnCount(); i++) {
    qDebug() << "origModel->Qt::Horizontal(" << i << ")" << origModel->headerData(i, Qt::Horizontal, Qt::DisplayRole);
    //transposedModel->setHeaderData(i, Qt::Vertical, origModel->headerData(i, Qt::Horizontal, Qt::DisplayRole), Qt::DisplayRole); //#try1
    transposedModel->setHeaderData(i, Qt::Vertical, QVariant( "abc" ), Qt::DisplayRole); // #try2
}

#1または#2を試しても、setHeaderDataの呼び出しはfalseと評価されます...

何か案は?

@Vinícius Gobbo A. de Oliveiraが指摘したように修正

4

2 に答える 2

0

面白いことに、ドキュメントには、これは仮想メソッドであると記載されています。

virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const

(...)

QVariant QAbstractProxyModel::headerData(int セクション、Qt::Orientation、int ロール) 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を呼び出し、これは正しいインデックスを取得する必要がありますか?

于 2014-09-26T14:29:52.670 に答える