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

时间:2018-12-09 11:15:10

标签: c++ qt qml

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

该模型委托给qml ListView。

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

//Next method is overrided

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

该函数内部的INDEX和ROLE来自何处?

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

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,但这只是一种解决方法,它破坏了不可变的(const)系统

//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);
    }
}

现在我们可以使用类似的东西:

main.qml

Text{                 
   text: iconName                   
}

model.h

Q_PROPERTY(QString iconName READ getIconName CONSTANT);

QString getIconName()
{
    return record(current_id).value("id").toString();
}