2013-01-07 3 views
1

내 문제를 설명하기가 어려워서 간단하게 만들 것이며 작업을 수행하기를 바랍니다. QtQuick 2.0과 함께 Qt5를 사용하고 있습니다.목록 모델이 QAbstractListModel에서 상속되고 목록 항목 속성이 QML에서 업데이트되지 않습니다

QAbstractListModel에서 상속받은 MyListModel 클래스를 만들고 MyListItem 유형의 항목을 보유하고 있습니다. QML ListView에서 model: myListModel으로 사용하고 대리자는 멋진 TextInput 상자에 MyListItem의 quantity 속성을 표시합니다. 모든 것이 잘 작동합니다.

그러나 대리자에서 quantity 값을 변경하면 모델의 항목이 업데이트되지 않습니다. I 을 알고 있습니다. 내 setQuantity(long desired_quantity) 함수 (MyListItem의 멤버)가 실행되지 않기 때문에 업데이트되지 않습니다. 간단히 말해서, 실제로 대리자 내에서 setQuantity 함수를 호출하는 방법을 알 수 없습니다. Q_PROPERTY(long quantity READ quantity WRITE setQuantity)을 MyListItem에 추가 한 다음 setContextProperty()을 사용하여 MyListItem myTemp 개체를 QML에 노출 한 다음 myTemp.quantity = 10을 호출하여 수동으로 처리 할 수 ​​있습니다. 하지만 대리인이 quantity 속성에 쓸 수 없다면 (읽기만 가능함) 작업을 수행하지는 못합니다.

누군가 올바른 방향으로 나를 가리킬 수 있습니까? Qt 디자이너가 예상했던 모든 것을 시도한 것처럼 느껴졌고 아무 것도 얻지 못했습니다. 그리고 내 문제를 명확하게 다루는 문서를 찾을 수 없습니다.

답변

3

TextInput 상자는 자동으로 C++ 모델을 업데이트하지 않으므로 혼자서해야합니다. 당신은 당신이 모델에 슬롯 또는 Q_INVOKABLE 방법을 추가하여이 작업을 수행 할 수 있습니다

//add a slot to you model 
public slots: 
setDataInModel(const int index, const QVariant &value); 
//or add Q_INVOKABLE method: 
public: 
Q_INVOKABLE setData(const int index, const QVariant &value); 

당신은 당신의 모델에서 적절한 데이터 행을 변경 있도록 다음 방법 중 하나를 구현해야합니다. 업데이트 후 메서드 내에서 dataChanged 메서드를 호출하는 것을 잊지 마십시오. 당신은 다음의 TextInput가 업데이트 될 때 수동으로 QML 위임에서 이러한 메서드를 호출 할 수 있습니다

여기 인덱스
onAccepted: { 
    model.setDataInModel(index, text) 
} 

각 대표에 정의 텍스트가의 TextInput의 텍스트입니다 속성입니다.

+0

이렇게했습니다. 델리게이트가 단순히 색인 대신 목록 객체에 대한 미리 만들어진 참조를 단순히 가지고 있지 않은 이유에 대한 의견이 있으십니까? QSortFilterProxyModel 객체를 사용하고있는 모델에서 작동시키기 위해서는 QSortFilterProxyModel을 서브 클래스 화하고'modifyQuantity()'함수를 원래 모델로 다시 전달해야합니다. – jmbeck

+1

대리인은 ** dataChanged **와 같은 신호를받을 때만 모델에서 데이터를 읽습니다. 따라서 일반적으로 목록 개체에 대한 참조가 필요하지 않습니다. 한 가지 해결책은 각 항목의 고유 번호를 반환하는 모델에 추가 역할을 추가하는 것입니다. 그런 다음 인덱스 대신 모델 변경 함수를 호출 할 때 사용할 수 있습니다. QSortFilterProxyModel을 서브 클래스하지 않아도됩니다. – JuliusG

+0

그 아이디어의 유일한 문제는 모델에서 고유 ID를 검색하는 데 걸리는 시간 일 것입니다. 맞습니까? 내 경우 엔 그게 효과가 있을지 모르지만 지름길을 이용하려면 당혹 스러울 것입니다. 편집 : 나는 지름길을했다. 그것은 아름답게 일했습니다. 게으름을 격려해 주길! (진심으로 감사합니다.) – jmbeck