D'accord, j'ai une question très basique QStandardItemModel
rempli de quelques chiffres. J'ai réussi à l'afficher dans un QTableView
c'est bon. J'ai créé un nouveau modèle ( sous-classe soit de QAbstractItemModel
o QAbstractProxyModel
), qui est une sorte de couche d'un modèle existant - il est nécessaire de définir le modèle source, et cette nouvelle couche devrait effectuer certaines transformations sur le modèle réel.
Mon problème est que, dans la couche supérieure, disons "modèle de couche", le data( const QModelIndex & index, int role )
La fonction membre n'est jamais appelée, mais je voudrais modifier les méthodes d'affichage en fonction du paramètre "rôle".
Voici un exemple de code, qui démontre que le modèle original du data(index,role)
est toujours appelé, tandis que le modèle de couche data(index,role)
jamais. Pourquoi ? Comment l'objet QTableView peut-il "sauter" la couche supérieure de l'objet QTableView ? data(index,role)
?
#include <QtGui/QApplication>
#include <QtGui>
#include <QStandardItemModel>
class MyModel : public QStandardItemModel
{
public:
MyModel(const int r, const int c, QObject\* parent = 0) : QStandardItemModel(r,c,parent) {}
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const {
qDebug() << "mymodel data";
return this->itemFromIndex(index)->data(role);
}
};
class MyProxyModel : public QAbstractProxyModel
{
public:
MyProxyModel(QObject\* parent = 0) : QAbstractProxyModel(parent) {}
QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const {
return this->sourceModel()->index(row,column,parent);
}
QModelIndex parent ( const QModelIndex & index ) const {
return this->sourceModel()->parent(index);
}
QModelIndex mapFromSource ( const QModelIndex & sourceIndex ) const
{
return sourceIndex;
}
QModelIndex mapToSource ( const QModelIndex & proxyIndex ) const
{
return proxyIndex;
}
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const {
qDebug() << "myproxymodel data";
return this->sourceModel()->data(index,role);
}
int rowCount ( const QModelIndex & parent = QModelIndex() ) const {
return this->sourceModel()->rowCount(parent);
}
int columnCount ( const QModelIndex & parent = QModelIndex() ) const {
return this->sourceModel()->columnCount(parent);
}
};
int main(int argc, char \*argv\[\])
{
QApplication app(argc,argv);
MyModel model(8, 2);
MyProxyModel mymodel;
mymodel.setSourceModel(&model);
QTableView tableView;
tableView.setModel(&mymodel);
tableView.horizontalHeader()->setStretchLastSection(true);
for (int row = 0; row < 8; ++row) {
for (int column = 0; column < 2; ++column) {
QModelIndex index = model.index(row, column, QModelIndex());
model.setData(index, QVariant((row+1) \* (column+1)));
}
}
tableView.show();
return app.exec();
}