2017-01-09 30 views
0

내 코드 :QML : 구성 요소 로컬 속성에 의해 이름이 숨겨진 경우 컨텍스트 속성에 액세스하는 방법?

MAIN.CPP :

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QQmlContext> 

int main(int argc, char *argv[]) { 
    QGuiApplication app(argc, argv); 

    QQmlApplicationEngine engine; 

    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
    engine.rootContext()->setContextProperty("text", "hey"); 

    return app.exec(); 
} 

main.qml : 물론

import QtQuick 2.5 
import QtQuick.Window 2.2 

Window { 
    id: window 
    visible: true 
    width: 640 
    height: 480 

    Text { 
     text: text 
    } 
} 

text: text 라인은 I가 원하는 것을하지 않는다 , 때문에 이름 섀도 잉.

루트 컨텍스트가 아닌 루트 개체의 속성을 설정하고 text: window.text을 사용하여이 문제를 해결했습니다.

실제 수정본이 있습니까?

+1

직접적인 대답은 아니지만, 우리가 적용하는 코드 규칙은 컨텍스트 변수 앞에 밑줄을 붙이는 것입니다 (따라서 "_text"라고도 함). 이것은 실제적으로 충돌을 피합니다. * 그리고 속성이 C++에서 왔음을 명확하게 나타내므로 QML 코드에서 속성을 찾는 것이 무의미합니다. – peppe

+2

더 나은 대답은 setContextProperty 대신 qmlRegisterSingletonType을 사용하는 것입니다. 이 경우 장점은 정규화 된 가져 오기를 사용하여 싱글 톤 및 해당 속성에 액세스하여 이름 충돌을 해결할 수 있다는 것입니다. – peppe

+0

또한 싱글 톤은 조회를 위해 훨씬 더 빠르다고 가정합니다. – dtech

답변

0

그렇지 않습니다. 컨텍스트 속성의 이름으로 text을 사용하는 것은 최악의 선택과 같습니다. 글자 그대로 blahblah을 사용하면 더 좋아질 것입니다. 왜 문제를 일으키는가?

별칭을 구현하여 루트 개체의 컨텍스트 속성에 액세스하고 루트 개체를 동적 범위 속성으로 노출 할 수 있습니다. 이렇게하면 문맥 속성 을 여전히 사용할 수 있다는 장점이 있지만 값 비싼 동적 속성 조회는 루트까지 줄지 않고도 대체 문을 제공하면서 문맥 속성에 도달하는 데는 효율성이 떨어집니다 (). 그림자가있는 경우

업데이트 : 실제로 컨텍스트 속성이 일반 동적 범위 개체 속성보다 조회하는 것이 더 빠르다고 가정하는 논리적 인 이유가 있습니다. 이 측면에서, 위 단락은 그림자 속성에 액세스하는 보조 식별자를 제공하는 데에만 사용할 수 있습니다.

주석에서 언급했듯이 조회가 포함되기보다는 가져 오기에서 직접 해결되기 때문에 실제로이 사용 컨텍스트에서 싱글 튼이 가장 잘 이해 될 것이며, 이름 충돌을 해결하는 데 유용 할 수있는 import as을 추가 할 수 있습니다. 싱글 톤을 통해 노출 된 여러 객체를 갖고 싶다면 각 객체를 별도의 싱글 톤으로 노출하는 대신 싱글 톤의 다른 객체 멤버를 가질 수 있습니다. 따라서 속성, 모델 항목 또는 특정 필요에 따라 동적으로 추가 할 수 있습니다.

+0

'text : text'는이 최소한의 예제에서 사용한 것입니다. 실제 코드에서는'sharedGLData : sharedGLData'입니다. "루트 객체를 동적 범위 속성으로 표시"하면 "루트 객체에 ID 할당"을 의미합니까? 그렇다면, 그 * 유효한 솔루션, 감사합니다 (비록 내가 정말 좋아하지 않아). 그것은 당신이 묘사하는 성능 이점을 가지고 있습니다. –

+0

나는 id를 할당하고 그것을 객체의 속성에 할당하는 것을 의미합니다. 일반적으로 다른 소스의 ID로 개체에 액세스 할 수 없으므로 섀도 잉되지 않도록 이름이 지정된 속성이 필요합니다. 그 이름에 관해서는, 갈등 해소에 이름을 붙이기 쉬운 것으로 알려져있는 방식으로 물건의 이름을 짓는 것은 나쁜 습관이라는 것입니다. 'C_sharedGLData'를 시도해보십시오. 이것은 context 속성이라고 알려줍니다. – dtech