> 백엔드 개발 > C++ > Qt 모델을 QObject의 속성으로 등록할 수 있습니까?

Qt 모델을 QObject의 속성으로 등록할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-24 18:34:04
원래의
794명이 탐색했습니다.

Can Qt Models Be Registered as Properties of QObjects?

Qt 모델을 QObjects의 속성으로 등록할 수 있습니까?

우선 Qt 모델이 실제로 QObjects의 속성으로 등록될 수 있다는 점을 분명히 하겠습니다. 매크로를 사용합니다. 예를 들어 여기에서 AnimalModel을 생각해 보세요.

http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel
로그인 후 복사

모델을 루트 컨텍스트에 전달

QuickView의 루트 컨텍스트에 모델을 전달하는 것은 간단한 방법입니다. 예는 다음과 같습니다.

QuickView view;
view.rootContext()->setContextProperty("myModel", &model); // where "model" is the AnimalModel
로그인 후 복사

마찬가지로 Qml 매크로를 통해 등록된 개체를 뷰에 추가할 수 있습니다.

view.rootContext()->setContextProperty("obj", pDataObject);
로그인 후 복사

모델 속성이 있는 QObject

그러나 모든 유형의 데이터 모델을 포함하는 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이 아닌 AnimalModel *이 됩니다. 모델이 QAbstractListModel을 상속하는 한 NOTIFY 부분이 필요하지 않습니다. 모델 내의 변경 사항은 자동으로 반영됩니다.

유연한 모델 구현

보다 유연한 접근 방식은 QObject *를 저장하는 모델을 만드는 것입니다. QML에서는 다양한 속성을 가진 다양한 객체를 생성하고 이를 모델에 통합할 수 있습니다. 그런 다음 모델은 객체를 반환하는 단일 역할을 제공하므로 해당 속성을 쿼리하고 활용할 수 있습니다.

스키마 없는 모델

또한 QQmlListProperty 및 Q_CLASSINFO("DefaultProperty", "container")를 사용하여 "스키마 없는" 모델. 이를 통해 모델을 동적으로 구성하거나 QML의 선언적 구문을 사용할 수 있습니다. 중요한 점은 이 접근 방식이 객체를 선언적으로 추가하거나 제거하는 기능도 제공한다는 것입니다.

동적 데이터가 포함된 모델의 예

다음은 모든 것을 지원하는 모델 구현의 예입니다. 데이터 유형:

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

    Q_PROPERTY(int size READ size NOTIFY sizeChanged)
    Q_PROPERTY(QQmlListProperty<QObject> content READ content)
    Q_PROPERTY(QObject * parent READ parent WRITE setParent)
    Q_CLASSINFO("DefaultProperty", "content")
public:
    List(QObject *parent = 0) : QAbstractListModel(parent) { }
    // rest of the class ...
};
로그인 후 복사

이 모델은 다음을 포함하여 모든 QObject 또는 파생 클래스를 보유하는 데 사용할 수 있습니다. QML의 QtObject. 이는 ListView의 모델 역할을 할 수 있으며 슬롯이나 선언적 구문을 통해 동적 채우기를 지원합니다. 또한 객체 소유권을 처리하고 중첩되어 구획화된 트리 모델을 생성할 수 있습니다.

대리자용 로더

뷰에 다양한 객체 유형을 표시하기 위해 다음을 활용할 수 있습니다. 객체 유형에 따라 적절한 QML 파일을 로드하는 대리자용 로더.

일반 정렬 및 필터링 프록시

위 모델의 유용성을 높이기 위해 간단하고 동적인 일반 정렬 및 필터링 프록시를 구현할 수도 있습니다. 구현 요지의 예는 다음과 같습니다.

https://gist.github.com/gabor-boros/9e756b6dba5011c0286069feedbd3cc8
로그인 후 복사

위 내용은 Qt 모델을 QObject의 속성으로 등록할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿