당신이 C + + 측면에서 특별한 일을하지 않아도 목록 모델에서 역할에 대한 고전적인 접근 방식을 사용하려면 항상 같은 모델을 가지고 있으며 데이터 메소드를 구현해야합니다 :
QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const
model
연결된 속성이 ListView에 위임 사용할 수 있습니다 QML에서 서로 다른 역할에 액세스하려면 : 그 어디서든 Qt는 문서에 설명되어 생각하지 않는다
model.display // model.data(index, Qt::DisplayRole) in c++
model.decoration // Qt::DecorationRole
model.edit // Qt::EditRole
model.toolTip // Qt::ToolTipRole
// ... same for the other roles
(아직) ,하지만 찾을 수 QML 양식에 액세스 할 수있는 속성을 디버그 모드로 시작하고 대리점에 중단 점을 넣거나 모든 속성을 콘솔에 인쇄하십시오. 대리자 내의 model
속성은 QQmlDMAbstractItemModelData 유형이므로 일부 백그라운드에서 "Qt magic"이 발생하고 목록 모델 데이터를 감싸는 래퍼처럼 보입니다. Qt 설명서에서 공식적인 내용을 찾을 수 없었습니다. QML 디버거 등으로 혼자서 알아 냈습니다.)
델리게이트 외부에서 모델 데이터에 액세스해야하는 경우 기능에 대한 빌드가 있다고 생각하지 않으므로 직접 수행해야합니다.
나는 count
속성과 기본에 get
α- 함수와 유사한 QML의 ListModel 노출하는 사용자 정의 QAbstractListModel 클래스의 예를 들어했다 :
mylistmodel.h을
class MyListModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
public:
explicit MyListModel(QObject *parent = 0);
int rowCount(const QModelIndex & = QModelIndex()) const override { return m_data.count(); }
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
Q_INVOKABLE int get(int index) const { return m_data.at(index); }
signals:
void countChanged(int c);
private:
QList<int> m_data;
};
mylistmodel.cpp
MyListModel::MyListModel(QObject *parent) :
QAbstractListModel(parent)
{
m_data << 1 << 2 << 3 << 4 << 5; // test data
emit countChanged(rowCount());
}
QVariant MyListModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() < 0 || index.row() >= rowCount())
return QVariant();
int val = m_data.at(index.row());
switch (role) {
case Qt::DisplayRole:
return QString("data = %1").arg(val);
break;
case Qt::DecorationRole:
return QColor(val & 0x1 ? Qt::red : Qt::green);
break;
case Qt::EditRole:
return QString::number(val);
break;
default:
return QVariant();
}
}
속성과 함수를 QML에 노출하는 것이 매우 쉽기 때문에 이것을 위해 좋은 방법이라고 생각합니다.
ListView {
anchors.fill: parent
model: MyListModel { id: myModel }
delegate: Text {
text: model.display
}
Component.onCompleted: {
console.log(myModel.count) // 5
console.log(myModel.get(0)) // 1
}
}
성능 향상을 위해'QModelIndex idx = index (row, 0);'를 루프 밖으로 이동시킬 수 있습니다. –