2017-04-03 8 views
4

Qt 어플리케이션에서 작업 중이므로 동적으로 윈도우를 만들어야합니다. 각 창은 QObject 기반 C++ 백엔드 및 qml 기반 인터페이스로 구성됩니다. 각 창은 핵심 클래스에서 방출되는 신호 묶음에 연결해야합니다. 현재 해결 방법은 QQuickView에서 창을 추출하고 신호를 setSource()을 사용하여 qml을로드하는 것입니다. 올바른 방법입니까 아니면 더 좋은 방법이 있습니까? 모든 창에 하나의 QQmlEngine을 사용하고 (모든 창에 대해이 엔진을 부모로 사용하는 것이 더 낫습니까?) 또는 각각의 새 창에 대해 새 엔진을 만드시겠습니까?qml 윈도우를 동적으로 생성하는 올바른 방법

+0

동적으로 무엇을 의미합니까? QObject의 변수 목록을 갖고 각각에 대해 하나의 창을 원하십니까? – GrecKo

+0

@ GrecKo 예, 목록에있는 각 QObject에 대해 하나의 창 (동일한 qml 파일 사용)이있는 QObject 목록입니다. 그리고 핵심 클래스는 런타임에 객체 (및 창)를 추가 및/또는 제거 할 수 있어야합니다. –

답변

1

이 경우 QML 코드에 c++ model이 표시됩니다. 이 모델은 동적이기 때문에 (요소를 추가하거나 제거 할 수 있음) 일부 요소가 추가/제거되었다는 사실을 뷰에 알릴 수있는 QAbstractItemModel 파생 모델을 사용합니다. QList<QObject*>과 같은 다른 것을 사용하면 변경 될 때마다 전체 모델을 다시로드해야한다는 것을 뷰에 알려야합니다.

처음부터 모델을 구현하는 대신 QQmlObjectListModel from Qt QML Tricks과 같은 클래스를 사용할 수 있지만 C++에서 QList와 유사한 API를 노출하지만 은 해당 장면의 역할로 QObject 속성을 나타냅니다.

QObjects를 사용하지 않으려는 경우 사용할 수있는 또 다른 솔루션은 benlau's QSyncable입니다. 실제로이 도구를 모델에 적용하고 작업 표시 줄을 표시하는 Window을 인스턴스화하여 비슷한 상황에서 사용했습니다 각각).

그러면 QQmlApplicationEngine을 사용하고 setContextProperty으로 모델을 노출합니다. A QQuickView은 이미 창이므로 QML 코드에서 수동으로 창을 관리하는 것이 더 좋을 것이라고 생각하지 않습니다. 당신의 QML 코드에서 다음

는 루트 객체로서 Instantiator를 사용하는 모델을 설정하고, 그 대리인으로 Window을 사용

Instantiator { 
    model: yourModel 
    Window { 
     /* ... */ 
    } 
} 
+0

이 접근법은 다른 유형의 창을 지원할 수 있습니까? 또한 프로그램 세션을 저장하고 복원하기 위해 창 세트를 저장하고로드 할 수 있어야합니다.이 방법을 사용하여 어떻게 수행 할 수 있습니까? –

+0

나는 이것이 당신의 질문을 너무 넓게 두려워하는 것을 두려워합니다. 저기 윈도우를 저장하고로드하는 방법이 많이 있습니다 : 설정, 로컬 DB, 일부 사용자 지정 직렬화, ... 다른 종류의 창을 지원하는 것과 마찬가지로, 그것은 많은 것을 의미 할 수 있습니다. – GrecKo

+1

몇 가지 연구와 프로토 타입을 작성한 후에 해답을 제공해 주셔서 감사합니다.이 접근법은 실제로 제가 설명한 상황에 가장 적합하다는 결론을 얻었습니다. 불행히도 QML 창은 응용 프로그램의 전체 개념과 잘 맞지 않으므로 내 소프트웨어에서 위젯으로 다시 전환 할 것입니다. 그러나 답을 다시 한번 고맙다. –