Как назначить элемент QML свойству компонента в QML, а затем использовать этот объект внутри компонента? - PullRequest
25 голосов
/ 16 февраля 2011

Я пытаюсь создать объект QML, который действует как оболочка для других объектов. Вот мой файл QML (Container.qml):

Item {
    property string label
    property Item control

    Row {
        Label {
            text: label
        }

        // Not sure how to display the control assigned to the control property
    }
}

То, что я хотел бы сделать (в моем QML, который использует этот компонент), выглядит примерно так:

Container {
    label: "My Label"
    control: Textbox {
        text: "My Value"
    }
}

Когда подается этот QML, результат (в интерфейсе) должен быть чем-то похожим на вывод этого QML:

Item {
    Row {
        Label {
            text: "My Label"
        }
        Textbox {
            text: "My Value"
        }
    }
}

Возможно ли это? Когда я пытаюсь сделать это, я получаю «Невозможно назначить объект свойству» при назначении элемента свойству элемента управления. Я искал на форумах Qt и гуглил это беспощадно, но безуспешно. Если кто-нибудь знает ответ, он будет очень признателен.

Спасибо

Jack

Ответы [ 4 ]

35 голосов
/ 05 апреля 2012

Существует гораздо лучшее решение:

/* MyObject.qml */

Rectangle {
    default property alias data /* name can be any */ : inner_space.data

    /* ... You can put other elements here ... */
    Item {
       id: inner_space

       /* ... Params ... */
    }
    /* ... You can put other elements here ... */
}

И теперь мы можем делать все, что хотим!

/* main.qml */

Rectangle {
    MyObject {
        Button {
             /* ... */
        }
    }
}

Спасибо пользователю bobbaluba за предложение использовать свойство data вместо children.

29 голосов
/ 18 февраля 2011

Вы можете динамически загружать элементы, используя элемент Loader , а затем установить для свойства 'control' значение alias , которое напрямую ссылается на sourceComponent загрузчика.property.

Таким образом, ваш Container.qml может выглядеть следующим образом:

Item {
    property string label
    property alias control : loader.sourceComponent

    width: 200; height: 200

    Row {
        Label { text: label }
        Loader { id: loader }
    }
}

Теперь, когда вы назначаете графический элемент свойству 'control', он автоматически будет отображаться в Loader.

2 голосов
/ 16 мая 2014

Вы можете создать контейнер для других элементов, используя пользовательское свойство:

Item
{
    id: root

    property list<Item> rectList: [
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        },
        Rectangle
        {
            parent: root
        }
    ]
}

Обратите внимание, что родительский элемент для элементов Rectangle устанавливается вручную, поэтому они будут визуальными дочерними элементами контейнера.1005 * Вы можете оценить их как массив javascript

for ( var i = 0; i < root.rectList.length; i++ )
{
   var rect = root.rectList[i];
   rect.visible = true;
}

или

rect.rectList[1].visible = false;
1 голос
/ 17 февраля 2011

Я использую QML уже около месяца, боюсь, я понятия не имею, как это сделать.

Лучший план - выяснить все возможные вещи, которыми мог бы быть элемент управления (Textbox в вашем примере), создать экземпляр каждого компонента в вашей строке и установить соответствующее состояние на Item. Затем государство позаботится о том, чтобы требуемый компонент был видимым или невидимым в зависимости от ситуации.

Редактировать

Просто подумал. (Не пробовал, но попробуйте!) В обработчике Item Component.onCompleted: попробуйте вызвать control.createObject(rowID), где rowID - это id для вашего Row объекта (который вы хотите быть родителем control).

...