2016-09-02 3 views
0

사용자 지정 QML 구성 요소 (다중 선택을 허용하는 ListView의 특수화)를 만듭니다. 내 구성 요소에 제공된 객체에 첨부 된 속성을 제공하고 싶습니다. 나는 create attached properties using C++하는 방법을 참조하십시오. 그러나 순수 QML에서 사용자 지정 속성을 추가하는 방법에 대한 정보는 찾을 수 없습니다. QML을 사용하여이 작업을 수행 할 수 있습니까?QML의 사용자 지정 첨부 속성

+0

누군가가 의사로부터 견적을 찾아야합니다. AFAIK에는 QML 구문이 없습니다. – Velkan

+1

C++에서만 가능하다고 생각합니다. –

답변

4

QML을 사용하면 가능합니까? 단지 원하는 속성을 구현하는 어댑터 객체를 사용 - QML에서이 대안, 간단하고 깨끗한 방법이 있습니다

번호

+0

신뢰할 수있는 답변 주셔서 감사합니다. – Phrogz

+2

아,이 문서의 [이 섹션] (http://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#attached-properties-and-attached-)의 어딘가에서 언급하는 것이 좋을 수도 있습니다. 신호 처리기). – Phrogz

+2

https://codereview.qt-project.org/#/c/170036/ – Mitch

2

. 그런 다음 어댑터에 중첩 만 연결하는 대신 상위/컨테이너로 사용할 수 있습니다. 객체를 어댑터에 중첩하여 다른 C++ 독점 그룹 속성을 가져올 수도 있습니다. 이 오버 헤드를 최소화 할 수있는 방법은 단점을 가지고 JS 객체와 속성을 사용하는 것입니다. 변경 알림은 수동으로 방출하여 어느 정도 완화 할 수 있습니다.

예 :

// Adapter.qml - interface with attached properties 
Item { 
    id: adapter 
    property int customInt : Math.random() * 1000 
    property var group : {"a" : Math.random(), "b" : Math.random() } 
    default property Component delegate 
    width: childrenRect.width 
    height: childrenRect.height 
    Component.onCompleted: delegate.createObject(adapter) 
} 

// usage 
ListView { 
    width: 100 
    height: 300 
    model: 5 
    delegate: Adapter { 
    Row { 
     spacing: 10 
     Text { text: index } 
     Text { text: customInt } 
     Text { text: group.a } 
     Text { text: group.a } 
    } 
    } 
} 

그것은 다른 QML의 해결 방법에 비해 상당히 고통과 편리합니다. parent.parent.customInt도 할 필요가 없습니다. 속성이 연결되어있는 것처럼 직접 액세스 할 수 있습니다. 이는 동적 범위 지정으로 인해 작동합니다. default property을 사용하면 내부 위임자를 어댑터에 직접 추가 할 대리자를 중첩하는 속성으로 설정하지 않아도됩니다. 당신은 그냥 자리에 래핑 수있는 그 곡예 과잉 많은 경우에

는 : 뷰가 제대로 객체를 레이아웃 할 수 있도록

ListView { 
    width: 100 
    height: 300 
    model: 5 
    delegate: Item { 
    width: childrenRect.width 
    height: childrenRect.height 
    property string custom1: "another" 
    property string custom2: "set of" 
    property string custom3: "properties" 
    Row { 
     spacing: 10 
     Text { text: index } 
     Text { text: custom1 } 
     Text { text: custom2 } 
     Text { text: custom3 } 
    } 
    } 
} 

유일한 중요한 부분은 정말 어댑터 개체의 크기에 대한 구속력 . 필자는 기본적으로 동일하지만 C++로 구현 된 Wrap 요소를 일상적으로 사용합니다.이 요소는 QML 바인딩보다 훨씬 효율적입니다.

+0

제안하는 것을 보여주는 예를 제공해 줄 수 있습니까? 나는 그것을 그리는 데 어려움을 겪고있다. – Phrogz

+0

@Phrogz 거기에 당신이 간다. – dtech