2017-01-09 15 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 линия не делать то, что я хочу его , из-за имени затенение.

Я работал над этим, установив свойство на корневом объекте, а не на корневой контекст, и используя text: window.text.

Есть ли какие-либо реальные исправления, хотя?

+1

Не прямой ответ, но: условное обозначение кода, которое мы применяем, - это префикс контекстных переменных с подчеркиванием (так что в вашем случае это будет называться «_text»). Это на практике позволяет избежать конфликтов * и *, что очень ясно, что свойство исходит из C++, поэтому бессмысленно искать его в QML-коде. – peppe

+2

Лучше ответить вместо этого на использование qmlRegisterSingletonType, а не на setContextProperty. Преимущество в этом случае заключается в том, что он может использовать квалифицированный импорт для доступа к singleton и его свойствам, разрешая ваше совпадение имен. – peppe

+0

Кроме того, синглтоны должны быть еще быстрее для поиска. – dtech

ответ

0

У вас нет. Использование text для имени свойства контекста похоже на наихудший возможный выбор. Вы буквально делаете это лучше, используя blahblah. Зачем предлагать неприятности?

Вы можете реализовать псевдоним, чтобы получить доступ к свойству контекста в корневом объекте, а также подвергнуть объект root как свойство динамической области. Это будет иметь преимущество, заключающееся в том, что все еще можно использовать свойство контекста , избегая дорогостоящего динамического поиска свойств вплоть до корня, сохраняя при этом альтернативу , хотя и менее эффективный способ, чтобы добраться до свойства контекста в тех случаях, когда он затенен.

Обновление: на самом деле существует логическая причина предположить, что свойства контекста быстрее, чем обычные свойства объекта динамической области. В этом аспекте вышеуказанный абзац может использоваться только для предоставления вторичного идентификатора для доступа к теневому свойству.

Как упоминалось в комментариях, синглтон на самом деле имеет наибольший смысл в этом контексте использования, поскольку он напрямую разрешен из импорта, а не с помощью поиска, плюс вы можете import as, который может быть полезен для разрешения конфликтов имен. Если вы хотите, чтобы несколько объектов экспонировались через одноэлемент, вместо того, чтобы разоблачать каждый из них как отдельный синглтон, вы можете просто иметь разные элементы элемента singleton, которые могут быть добавлены динамически как свойства, элементы модели или что-то, что удовлетворяет конкретную потребность.

+0

'text: text' - это то, что я использовал в этом минимальном примере. В реальном коде это 'sharedGLData: sharedGLData'. Под «раскрытием корневого объекта как свойства динамической области видимости» вы просто имеете в виду «присвоение идентификатора корневому объекту»? Если это так, то это * является действительным решением, спасибо (хотя мне это действительно не нравится). У этого есть преимущество производительности, которое Вы описываете. –

+0

Я имею в виду как назначение идентификатора, так и присвоение ему свойства этого объекта. Как правило, вы не можете получить доступ к объекту по идентификатору из другого источника, поэтому нужно свойство, названное так, чтобы оно не получило тени. Что касается имени, то подразумевалось, что это плохая практика, чтобы называть вещи таким образом, который, как известно, подвержен конфликтам разрешения имен. Попробуйте 'C_sharedGLData', который также сообщает вам, что это свойство контекста. – dtech