gpt4 book ai didi

qt - 在 QT 中,链接模型无法按预期工作

转载 作者:行者123 更新时间:2023-12-02 00:25:33 26 4
gpt4 key购买 nike

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

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

这里是一个示例代码,它演示了始终调用原始模型的 data(index,role),而图层模型的 data(index,role)绝不。为什么? 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();}

最佳答案

因为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;
}
};

关于qt - 在 QT 中,链接模型无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1387912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com