LINUX.ORG.RU

Qml. Обращение к свойству родительского элемента при переопределении свойства.

 , ,


0

1

Представим что есть подобный код:

//! SomeItem.qml
Rectangle {
    id: root
    property alias color: internal.color

    Rectangle {
        id: internal
        anchors.centerIn: parent
        width: parent.width/2
        height: parent.height/2
    }
}

При обращении из вне к объекту SomeItem.color будет выставлено свойство внутреннего ректенгла. То же самое и изнутри при указании свойства color хоть с указанием id, хоть без.

Так вот, как мне обратиться к свойству редительского объекта Rectangle? В С++ при наследовании достаточно было бы сделать что-то вроде Rectangle::color. Не спрашивайте зачем и не предлагайте поменять названия свойств, это и так ясно. Интересует именно такой вариант, возможно ли это?

Ответ на: комментарий от a1batross

Нет.

Мне нужно любым способом выставить свойство у root. Но при том условии, что свойство переопределено(объявлено свойство с таким же названием). У Rectangle уже есть свойство color. Я сделал его корневым элементом, а потом объявил у него новое свойство с таким же именем(color). Так вот, как мне обратиться именно к свойству, которое у того самого родительского объекта Rectangle, а не к тому, которое я объявил сам?

Ну в данном случае как бы я не задавал свойство color - меняется цвет внутреннего прямоугольника internal. А надо скажем при таком вот коде изменить цвет у прямоугольника root.

Blastbit
() автор топика
Ответ на: комментарий от a1batross

Нет, тут суть в том, что свойство внешнего прямоугольника нельзя достать, если объявлен биндинг с таким же именем. Т.е. маскировка свойства.

Adonai ★★★
()
Последнее исправление: Adonai (всего исправлений: 1)
Ответ на: комментарий от Blastbit

А, я только сейчас заметил.

При таком коде человечно не выйдет. Лучше будет назвать свойство для внутреннего прямоугольника как-нибудь по-другому и это будет правильнее. Но ты про это уже сказал.

a1batross ★★★★★
()

В С++ при наследовании достаточно было бы сделать что-то вроде Rectangle::color.

В С++ есть смысл вызывать лишь методы предка, поля предка и поля потомка (общие) абсолютно идентичны, не так ли?

Ну а вообще, это весьма условно можно назвать наследованием, это скорее похоже на иерархию виджетов на форме, когда слово parent используется в том же смысле.

Прямого аналога наследования из С++ тут нет, разве что ограниченное снижение трудоемкости можно получить используя следующую конструкцию:

//Parent.qml
Rectangle {
    property string test
}

//Children.qml
Parent {
    Text {
        id: testText
        text: test
        anchors.centerIn: parent
    }
}

//main.qml
Children {
    test: "haha"
    anchors.centerIn: parent
}

P.S. Вот тут к концу треда эта тема всплыла подробнее.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от CrossFire

Предпоследний коммент от анонимуса - это я :) qml vs qwidgets (комментарий)

Я конечно понимаю, что это не совсем наследование и прочее. Но вот стало интересно, а есть ли такой способ. В официальных доках нашел только перекрытие свойства, а вот как обратиться к перекрытому не указано там.

Blastbit
() автор топика

Читайте документацию до конца.

Any object that use this type and refer to its color property will be referring to the alias rather than the ordinary Rectangle::color property. Internally, however, the red can correctly set its color property and refer to the actual defined property rather than the alias.

Rectangle {
    id: root
    property alias color: internal.color
    property color nativeColor
    color: nativeColor

    Rectangle {
        id: internal
        anchors.centerIn: parent
        width: parent.width/2
        height: parent.height/2
    }
}
Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Не спрашивайте зачем и не предлагайте поменять названия свойств, это и так ясно.

Читайте посты до конца.

CrossFire ★★★★★
()
Ответ на: комментарий от CrossFire

Но то, что алиас таки не перекрывает обращение изнутри, это интересное замечание, да.

CrossFire ★★★★★
()
Ответ на: комментарий от Dendy

Да да, я читал. НО не работает это. Выставление изнутри не работает, внутренний прямоугольник остается белым по дефолту. Возможно дело в версии QtQuick? я пробую на 2.3 версии и Qt 5.3 соответственно.

//SomeItem.qml
import QtQuick 2.3

Rectangle {
    id: root
    property alias color: internal.color
    property color nativeColor: "green" //остается белым
    color: nativeColor

    Rectangle {
        id: internal
        anchors.centerIn: parent
        width: parent.width/2
        height: parent.height/2
    }
    Component.onCompleted: {
        nativeColor = "yellow"  //внутренний root остается белым, internal - красным
        color = "purple"        //внутренний root остается белым, internal - пурпурным
    }
}

//! main.qml
import QtQuick 2.3
...
    SomeItem {
        width: 100
        height: 100
        color: "red"  //internal становится красным
        nativeColor: "blue" //root остается белым
    }
...

если запустить прямо в таком вот виде, то получается белый квадрат и внутри пурпурный квадрат. Я думаю поверите без скринов.

ЧЯДНТ?

Blastbit
() автор топика
Ответ на: комментарий от Blastbit

Во-первых, неясно как технически это чинить. По документации? Это неочевидное поведение. Во-вторых, это обходится созданием отдельного Item на который и вешаются алиасы. Думаю, если разработчики и в курсе, то понизили приоритет проблемы до минимального.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Кажется разобрался, просто в документации не совсем ясно описан этот случай. Это будет работать, если объявить элиас раньше, чем перекрывающее свойство.

Rectangle {
    id: root
    property alias nativeColor: root.color
    property alias color: internal.color

    nativeColor: "brown"

    Rectangle {
        id: internal
        anchors.centerIn: parent
        width: parent.width/2
        height: parent.height/2
    }
}

И всё становится на свои места. И извне и изнутри всё корректно изменяется и работает.

Blastbit
() автор топика
Ответ на: комментарий от Blastbit

Честно говоря, больше на баг похоже, когда поведение зависит от порядка определения параметров.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Ну вообще согласен.

Но вот такая ситуация вообще не работает.

Rectangle {
    id: root
    width: 100
    height: 62

    property alias nativeColor: root.color
    property color color: "red"
}

....

 SomeItem {
        nativeColor: "blue"
        color: "green"
        width: 100
        height: 100
    }

Не выставляется никакой цвет, только по умолчанию. Это можно обойти используя ещё 1 объект и лишние псевдонимы, но это уже легкая наркомания.

Blastbit
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.