我的Qt项目中有一个模型。
该模型委托给qml ListView。
我不知道如何通过C ++迭代获得“当前索引”。
//Next method is overrided
QVariant SqlTableModel::data(const QModelIndex &index, int role) const
该函数内部的INDEX和ROLE来自何处?
在其他语言中,通常将当前迭代索引传递给模型。例如,php中的getter可以通过id和其他关系模型返回订单成本。
答案 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();
}