2016-11-15 1 views
1

QML을 사용하여 델리게이트 외부에서 모델 (하위 클래스 QAbstractItemModel)의 데이터를 어떻게 가져 옵니까?QML의 C++ 모델에서 색인으로 데이터 가져 오기

I는 다음과 같이 그것을 시도 :

Identities { 
    id: identities_model 
} 
... 
console.log(identities_model[0].email) 

하지만 오류 얻을 : (

QVariant Identities::data(const QModelIndex &index, int role) const { 
    int row_num; 
    row_num=index.row(); 
    if (role==EmailRole) { 
     QList <QString> qlist; 
     qlist=identities_map.keys(); 
     if (row_num>=qlist.size()) return (QVariant()); 
     return QVariant(qlist.at(row_num)); 
    } 
    if (role==PasswordRole) { 
     QList <QString> qlist; 
     qlist=identities_map.keys(); 
     if (row_num>=qlist.size()) return (QVariant()); 
     Identity *identity; 
     identity=identities_map.value(qlist.at(row_num)); 
     return QVariant(identity->password()); 
    } 
    if (role==Qt::DisplayRole) { 
     return(QVariant()); 
    } 
} 

내가 디버그 시도 :

TypeError: Cannot read property 'email' of undefined 

data() 방법은 다음과 같이 정의된다 몇 가지 중단 점 넣기). Identities::data() 또는에 대한 호출을 차단할 수 없습니다.QML의 제 모델을 향해. 델리게이트 외부에서 내 모델의 데이터에 어떻게 액세스해야합니까? (특정 행, 특정 역할) 델리게이트를 사용할 때 내 모델은 완벽하게 작동합니다.

답변

2

Identity * at(int index) 슬롯 또는 모델에 대한 호출 가능 기능을 구현하기 만하면됩니다. 그렇다면 identities_model.at(0).email가 작동합니다.

여기서는 역할이 없습니다. IdentityQObject이므로, QML에서 사용할 수 있도록 속성으로 구현해야합니다. 역할은 뷰 대리인 만 사용할 수 있습니다. QObject이 파생되지 않았다면 Q_GADGET을 사용하여 유형에 대한 메타 정보를 생성하여 QML에서 액세스 할 수있게 만들 수 있습니다.

[] 연산자는 모델이 JS 배열이었던 경우 작동합니다. 또한 JS는 [] 연산자가없는 모델에 대해 불평하지 않고 정의되지 않았기 때문에 undefined을 제공하기 만합니다.

var v = 3 
    console.log(v[0]) 

JS는 연산자 오버로딩을 지원하지 않으며,이 C++ 측면에서 구현 어떤 연산자를 지원합니다 : 같은 방법은 이런 식으로 뭔가를 할 것이다. 기능 만.

+0

'at'보다는 보통 'get'입니까? 적어도'ListModel'에는'at'가없고'get' 함수 만 있습니다. – derM

+0

정말 고마워요! 내 자신의 방법을 사용하여 데이터를 얻는 것이 좋은 해결책입니다. – Nulik

+1

@derM -'set()'을 할 계획이라면 확실히'get()'을 원할 것입니다. 그렇게하지 않으면 일을 끝내는 한별로 중요하지 않습니다. 색인 0의 항목은 나에게 맞는 것 같습니다. – dtech

관련 문제