Динамическое создание объектов в QML

Я новичок в QML и хотел бы понять, как работает создание объектов при разделении кода по разным файлам (как это кажется хорошей практикой кода).

Я знаю, что могу назвать свойство элемента в том же файле:

// MyItem.qml
Item {
  id: myItem
  property string name: "Myself"

  onClicked: {
    console.log(myItem.name)
  }
}

но как мне создать экземпляр одного и того же элемента в другом файле?

// Main.qml
Button {
  onClicked: {
    console.log(myItem.name)
  }
}

Бросает ReferenceError: name is not defined ошибка, которая, как я полагаю, означает: "невозможно вызвать имя свойства неопределенного объекта".

Это обычная практика в QML (таких примеров не видно) или все просто помещают все в один файл?

1 ответ

Решение

Вы делаете что-то вроде:

// Main.qml
MyItem {
    id: thisIsMyItem
}
Button {
    onClicked: console.log(thisIsMyItem.name)
}

Идея состоит в том, что вы можете использовать компоненты, которые вы объявили в том же документе, на который ссылается их идентификатор. Вы называете эти файлы "документы" в QML.

Другое дело, что вам не нужно использовать идентификатор myItem в MyItem.qml, вы можете просто ссылаться на свойство name с его именем. Конечно, использование идентификатора необходимо, когда у вас есть несколько компонентов в одном документе со свойством name.

// MyItem.qml
Item {
    id: myItem
    property string name: "Myself"
    Item {
        id: secondItem
        property string name: "Second Item"
        Component.onCompleted: console.log("This item's name is " + name + ", and parent item's name is " + myItem.name) 
    }
}

Одно замечание: что onClicked в вашем MyItem.qml вызовет синтаксическую ошибку, так как Item не имеет сигнала clicked().

Надеюсь это поможет.

Другие вопросы по тегам