5

好吧,我有一个非常基本的QStandardItemModel,充满了一些数字。我设法将它显示在 aQTableView中,没关系。我创建了一个新模型( or 的子类QAbstractItemModelQAbstractProxyModel,它是现有模型的某种层 - 需要设置源模型,并且这个新层应该对真实模型进行一些转换。

我的问题是,在顶层,说“层模型”data( const QModelIndex & index, int role )成员函数从未调用过,但是我想通过角色参数改变显示方法。

这是一个示例代码,它演示了data(index,role)始终调用原始模型,而data(index,role)从不调用层模型。为什么?QTableView 对象如何“跳过”顶层的data(index,role)

#include <QtGui/QApplication>
#include <QtGui>
#include <QStandardItemModel>

MyModel 类:公共 QStandardItemModel
{
上市:
    MyModel(const int r, const int c, QObject* parent = 0) : QStandardItemModel(r,c,parent) {}
    QVariant 数据 ( const QModelIndex & index, int role = Qt::DisplayRole ) const {
        qDebug() << "我的模型数据";
        返回 this->itemFromIndex(index)->data(role);
    }
};

MyProxyModel 类:公共 QAbstractProxyModel
{
上市:

    MyProxyModel(QObject* parent = 0) : QAbstractProxyModel(parent) {}
    QModelIndex 索引( int 行,int 列,const QModelIndex & parent = QModelIndex() ) const {
        返回 this->sourceModel()->index(row,column,parent);
    }
    QModelIndex 父级 ( const QModelIndex & index ) const {
        返回 this->sourceModel()->parent(index);
    }
    QModelIndex mapFromSource ( const QModelIndex & sourceIndex ) const
    {
        返回源索引;
    }
    QModelIndex mapToSource ( const QModelIndex & proxyIndex ) const
    {
        返回代理索引;
    }
    QVariant 数据 ( const QModelIndex & index, int role = Qt::DisplayRole ) const {
        qDebug() << "myproxymodel 数据";
        返回 this->sourceModel()->data(index,role);
    }

    int rowCount ( const QModelIndex & parent = QModelIndex() ) const {
        返回 this->sourceModel()->rowCount(parent);
    }
    int columnCount ( const QModelIndex & parent = QModelIndex() ) const {
        返回 this->sourceModel()->columnCount(parent);
    }
};

int main(int argc, char *argv[])
{
    QApplication 应用程序(argc,argv);
    MyModel 模型(8, 2);
    我的代理模型我的模型;
    mymodel.setSourceModel(&model);

    QTableView 表视图;
    tableView.setModel(&mymodel);

    tableView.horizo​​ntalHeader()->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();
    返回 app.exec();
}

4

1 回答 1

6

因为 QTableView 使用模型索引来检索数据,大概是这样的。

QModelIndex index = model->index(row, column, parentIndex); 
index.data(Qt::DisplayRole);

您正在返回源模型的模型索引而不是代理模型的索引:

QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const {
    return this->sourceModel()->index(row,column,parent);
}

尝试将模型索引转换为代理模型的索引

QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const {
    return this->createIndex(row,column,row);
}

不要忘记将映射重写为源函数并从源函数映射。


解决方案

class MyTableProxyModel : public QAbstractProxyModel
{
    Q_OBJECT
public:
    MyTableProxyModel (QObject* parent = 0) 
        : QAbstractProxyModel(parent) {
    }

    QModelIndex index(int row, int column, const QModelIndex& parent=QModelIndex()) const {
        return createIndex(row,column,row);
    }

    QModelIndex parent(const QModelIndex &index) const {
        //Works only for non-tree models
        return QModelIndex();
    }

    QModelIndex mapFromSource(const QModelIndex &source) const {
        return index(source.row(), source.column(), source.parent());
    }

    QModelIndex mapToSource(const QModelIndex &proxy) const {
        return (sourceModel()&&proxy.isValid())
            ? sourceModel()->index(proxy.row(), proxy.column(), proxy.parent()) 
            : QModelIndex();
    }

    QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const {
        qDebug() << "myproxymodel data";
        return mapToSource(index).data(role);
    }

    int rowCount ( const QModelIndex & parent = QModelIndex() ) const {
        return sourceModel() ? sourceModel()->rowCount(parent) : 0;
    }

    int columnCount ( const QModelIndex & parent = QModelIndex() ) const {
        return sourceModel() ? sourceModel()->columnCount(parent) : 0;
    }
};
于 2009-09-07T07:21:43.850 回答