首页 文章

如何通过c从qml ListView获取当前模型索引?

提问于
浏览
-1

我的Qt项目中有一个模型 .

该模型被委托给qml ListView .

我不知道如何通过C的迭代获得“当前索引” .

//Next method is overrided

QVariant SqlTableModel::data(const QModelIndex &index, int role) const

INDEX和ROLE在函数内部取得了什么?

在其他语言中,将当前迭代索引传递给模型是一种常规做法 . 例如,php中的getter可以通过id和其他关系模型返回订单成本 .

1 回答

  • 0

    I found a solution, but it's only a workaround and broke the immutable(const) system

    //int current_id; //defined in .h
    
    QHash<int, QByteArray> SqlTableModel::roleNames() const
    {
        QHash<int, QByteArray> result;
        int i, NEXT_USER_ROLE = Qt::UserRole + 1;
    
        //add sql fields names
        for(i = 0; i != record().count(); i++){
            result[NEXT_USER_ROLE + i] = record().fieldName(i).toUtf8();
        }
    
        //add property fields names
        auto meta = metaObject();
        for(int j = meta->propertyOffset(); j != meta->propertyCount(); j++ ){
            result[Qt::UserRole + i + j] = meta->property(j).name();
        }
        return result;
    }
    
    QVariant SqlTableModel::data(const QModelIndex &id, int role) const
    {
        int NEXT_USER_ROLE = Qt::UserRole + record().count();
        if(role >= NEXT_USER_ROLE){
            SqlTableModel * _this = const_cast<SqlTableModel*>(this);
            _this->current_id = id.row();
            return property(roleNames()[role]);
        }else{
            return QSqlTableModel::data(index(id.row(), role - Qt::UserRole - 1), Qt::DisplayRole);
        }
    }
    

    And now we can use something like this:

    main.qml

    Text{                 
       text: iconName                   
    }
    

    model.h

    Q_PROPERTY(QString iconName READ getIconName CONSTANT);
    
    QString getIconName()
    {
        return QSqlTableModel::data(index(current_id, 3), Qt::DisplayRole).toString();
    }
    

相关问题