QML QtQuick. Динамически созданный компонент не работает с привязками и основными методами - PullRequest
0 голосов
/ 28 июня 2018

Env: OS - победа 10 x86, qtcreator 4.6.1, mingw 5.3, qt 5.11

Создайте файл rect1.qml с помощью Rectangle.

import QtQuick 2.0

Rectangle {

    width: 40
    height: 40; 
    border.color: "blue"
    color: "green"; 
   width: childrenRect.width 
    height:   childrenRect.height 
   property int sub_border: 1 
   property color item_color: "green" 
   property bool view_bounding_box: false 
   property int sub_border: 1 

   onView_bounding_boxChanged: { 
       root.border.width = root.view_bounding_box ? sub_border : 0 
      console.log("BaseContainer", root.view_bounding_box, root.border.color) }
   }

В main.qml динамически создается компонент

Rectangle {
    id: root
    border.color: "blue"
    border.width: 0
    focus: true

    property int     edge_len:           20
    property bool    view_bounding_box:  false
    property var     active_object
    property var     deactivate_objects:[]
function loadComponent () {        
        var component = Qt.createComponent("rect1.qml");
        if (component .status === Component.Ready) {
            active_object = component.createObject(root, { 
            "view_bounding_box": root.view_bounding_box });
        }else if (component.status === Component.Error) {
            console.log("error creating component");
            console.log(component.errorString());
        }
    }

если я изменю ограничивающее свойство root.view_bounding_box - в сгенерированном экземпляре (active_object) обработчик сигнала вызываться не будет. Если я вызываю метод «содержащий» active_object с аргументами Qt.point (active_object.x, active_object.y), ничего не происходит, как будто заглушка называется

var point = Qt.point(active_object.x, active_object.y)
for (var i = 0;  i <  deactivate_objects.length; i++) {                
                if (deactivate_objects[i].contains(point)) {             // not worked       
                    deactivate_objects.push(active_object)
                    loadComponent ()
                    return
                }
            }
if (!root.contains(point)) {                                                     // worked
                deactivate_objects.push(active_object)
                loadComponent ()
            }

Цвет границы в active_objectis "зеленый", как цвет прямоугольника.

Это ошибка или я чего-то не понимаю в qml?

1 Ответ

0 голосов
/ 10 июля 2018

Метод «содержит (точка)» не работает, видимо, из-за «вызова» и «виртуального». Автоматическое связывание для динамически создаваемых объектов не работает. Вы должны сделать ручную привязку для выбранных свойств.

...