>백엔드 개발 >C++ >QML에서 사용할 일반 개체 모델을 만드는 방법은 무엇입니까?

QML에서 사용할 일반 개체 모델을 만드는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-28 21:22:12595검색

How to Create a Generic Object Model for Use in QML?

QML에서 사용할 일반 객체 모델을 만드는 방법

Qt 모델을 QObject의 속성으로 등록하려면 다음을 활용할 수 있습니다. Q_PROPERTY 매크로. 그러나 모든 모델 유형이 이 접근 방식과 호환되는 것은 아닙니다.

AnimalModel 사용

QAbstractListModel을 QML 뷰에 직접 전달하는 것이 일반적이지만 등록하는 것은 불가능합니다. 이를 사용하여 QObject의 속성으로 Q_PROPERTY.

동적 객체 모델 생성

이 제한을 극복하기 위해 모든 데이터 유형의 모델을 보유하는 사용자 정의 QObject를 생성할 수 있습니다. 다음 예를 고려하십시오.

class DataObject : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
    ...

    AnimalModel m_modelAnimals;

    Q_PROPERTY(AnimalModel *modelAnimals READ modelAnimals NOTIFY modelAnimalsChanged)
};

이것은 AnimalModel에 대한 포인터를 반환하는 속성을 가진 QObject를 생성합니다. 그런 다음 QML에서 다음과 같이 모델에 액세스할 수 있습니다.

DataObject {
    modelAnimals: {
        // Manipulate the model here
    }
}

스키마 없는 모델

더 많은 유연성을 원한다면 스키마 없는 모델을 만들 수 있습니다. 임의의 속성을 가진 객체를 허용합니다. 이를 달성하려면:

  1. QObject 를 저장하는 QAbstractListModel 또는 QObject 모델을 만듭니다.
  2. 객체를 반환하는 단일 객체 역할을 제공합니다.
  3. 로더를 대리자로 사용하여 객체를 기반으로 다양한 QML UI 구현을 인스턴스화합니다. type.
  4. QML의 선언적 구문을 사용하여 동적 구성을 허용하는 모델에 대해 QQmlListProperty 및 Q_CLASSINFO("DefaultProperty", "container")를 구현합니다.

목록 사용

다음은 예입니다. 다양한 개체 유형을 지원하는 일반 목록 모델:

class List : public QAbstractListModel
{
    Q_OBJECT
    QList<QObject *> _data;

    ...
};

다음을 사용하여 이 모델을 등록할 수 있습니다.

qmlRegisterType<List>("Core", 1, 0, "List");

다음과 같이 QML에서 사용할 수 있습니다.

List {
    QtObject { ... }
    QtObject { ... }
    List {
        QtObject { ... }
        QtObject { ... }
    }
}

동적 정렬 및 필터링

이 모델을 더 많이 만들기 위해 사용 가능한 경우 정렬 및 필터링 프록시를 구현할 수 있습니다.

class SortingFilteringProxy : public QAbstractListModel
{
    Q_OBJECT
    QSortFilterProxyModel _proxy;

    ...
};

이를 통해 포함된 개체의 임의 속성을 기반으로 고급 필터링 및 정렬 기능을 사용할 수 있습니다.

위 내용은 QML에서 사용할 일반 개체 모델을 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.