2011-12-21 3 views
1

Вложенное свойство QML LayoutMirroring позволяет переключать направленность элемента слева направо на право-налево или наоборот. Я хотел бы получить доступ к текущим значениям LayoutMirroring элемента из кода C++, расширяя приложение QML. Я понимаю, что функция qmlAttachedPropertiesObject может использоваться для доступа к прикрепленным свойствам из C++, как объясняется в documentation, но я не знаю, где я могу найти класс, который представляет это конкретное свойство в C++.Доступ к прикрепленному свойству QML LayoutMirroring из C++

Возможно ли это?

+0

Что вы имеете в виду при обращении ** это текущие значения **? .. Что это за ** ** **? Не могли бы вы описать немного больше! Но я уверен, что ** любые значения _it _ ** могут быть доступны или доступны из кода C++ и соответственно. Создание значений, доступных для кода C++, может быть выполнено путем вызова слота «Q_INVOKABLE» из кода JavaScript , Я не могу правильно истолковать ваш случай использования, поэтому я просто говорю свое мнение. – RajaRaviVarma

+0

То, что я имел в виду под ** это **, было значением определенного элемента. Я отредактировал вопрос, чтобы было более ясно (надеюсь). –

+0

И о решении с словом 'Q_INVOKABLE', я думаю, что это сработает, но мне потребуется изменить QML-код с помощью рассматриваемого объекта C++, и я надеялся избежать этого. «LayoutMirroring» может быть унаследован элементами от родителей, поэтому вместо того, чтобы менять только одно место, мне нужно будет изменить многое другое. –

ответ

1

Можно читать и писать вложенные свойства легко с QQmlProperty класса, так как Qt5.

Простой main.qml файл: Код

import QtQuick 2.0 

Rectangle { 
    LayoutMirroring.enabled: true 
    LayoutMirroring.childrenInherit: true 
} 

Простой C++, чтобы прочитать выше LayoutMirroring.enabled вложенное свойство:

QQuickView view; 
view.setSource(QUrl(QStringLiteral("qrc:/main.qml"))); 
view.show(); 

QQuickItem* rootItem = view.rootObject(); 
qDebug() << QQmlProperty::read(rootItem, "LayoutMirroring.enabled", qmlContext(rootItem)); 

Консоль вывода:

=> QVariant(bool, true) 
+0

Спасибо. Я больше не работаю над этим, но похоже, что он должен работать. –

0
import QtQuick 1.1 

Rectangle { 
id: parentRect 
property alias layoutValue : LayoutMirroring.enabled// ? true : false;// Read Only 
LayoutMirroring.enabled: false 
LayoutMirroring.childrenInherit: true 
width: 300; height: 50 
color: "yellow" 
border.width: 1 

Row { 
    anchors { left: parent.left; margins: 5 } 
    y: 5; spacing: 5 

    Repeater { 
     model: 5 

     Rectangle { 
      color: "red" 
      opacity: (5 - index)/5 
      width: 40; height: 40 

      Text { 
       text: index + 1 
       anchors.centerIn: parent 
      } 
     } 
    } 
} 
} 
 
#include 
#include 
#include 
#include 
#include "qmlapplicationviewer.h" 

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer app(createApplication(argc, argv)); 
    QScopedPointer viewer(QmlApplicationViewer::create()); 

    viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer->setMainQmlFile(QLatin1String("qml/Test/main.qml")); 
    QDeclarativeProperty propLayout(viewer->rootObject(),"layoutValue"); 
    QDeclarativeProperty propLayoutMargin(viewer->rootObject(),"anchors.leftMargin"); 

    qDebug() showExpanded(); 

    return app->exec(); 
} 
+0

Спасибо за очень подробный ответ, но, как я уже сказал в комментарии к вопросу, этот метод потребует от меня добавить такой псевдоним свойства в любой элемент, который я намерен прочитать с помощью свойства LayoutMirroring, и он не использует функция наследования. Я хотел бы, например, прочитать значение свойства LayoutMirroring для одного из внутренних прямоугольников в этом примере, не изменяя его. –

+0

На самом деле, он должен быть доступен из C++, как и другое свойство ** anchors.leftMargin **, но к нему нельзя было получить доступ напрямую. Я начал публикацию на форуме разработчиков Qt. Они ответили мне, что это может быть ошибка. Поэтому я должен указать его как ошибку. На данный момент, я думаю, что это единственный метод, который мне кажется простым. – RajaRaviVarma

+0

Спасибо. Возможно, вы можете опубликовать ссылку на ошибку здесь. Думаю, я хотел бы подписаться, и в маловероятном случае, когда кто-либо когда-нибудь прочтет этот вопрос, они могут быть заинтересованы. –