Я хочу написать приложение в QtQuick, которое динамически загружает контент. Я решил использовать Loader. Теперь у меня проблема, которая переполняет меня. Я думал, что потрачу на это две минуты, но мне потребовались два дня, и моя проблема все еще не решена.QtQuick QML. Невозможно назначить свойства объекту, загруженному загрузчиком
Я хочу загрузить объект из файла .qml, когда нажимается кнопка. При нажатии на разные кнопки будут заданы разные свойства для этого объекта. Объект представляет собой простой прямоугольник с текстом внутри него. Он имеет такие свойства, как ширина, высота, текст, цвет прямоугольника и цвет текста. Проблема в том, что загрузка прямоугольника с разными параметрами НЕ меняет ничего, кроме цвета прямоугольника. Я пробовал так много комбинаций имен, псевдонимов свойств и т. Д., Но это ничего мне не давало. Изменяется только цвет. Позвольте мне представить вам мой код:
//StartStateContent.qml --> I wish to use Loaders in my Finite States Machine, hence the name
import QtQuick 2.0
import QtQuick.Controls 2.0
Rectangle {
id: startStateContent
property int myWidth
property int myHeight
property color myColor
property alias myText: name.text
property string myText2
property alias myTextColor: name.color
property color myTextColor2
// width: myWidth
// height: myHeight
color: kolor
Text {
anchors.centerIn: parent
id: name
text: "test"
//text: myText2
color: "yellow"
//color: myTextColor2
}
}
И фрагмент main.qml
Window {
visible: true
id: root
width: 500
height: 500
title: qsTr("Hello World")
Loader
{
id: pageLoader
anchors.top: root.top
anchors.left: root.left
width: root.width
height: root.height/2
}
Button{
id: but1
text: "red"
anchors.top: pageLoader.bottom
anchors.left: root.left
height: root.height/2
onClicked: {
pageLoader.setSource("StartStateContent.qml", {"myColor": "red"}, {"myTextColor" : "white"})
console.log("button red clicked")
}
}
Button{
id: but2
text: "green"
anchors.top: pageLoader.bottom
anchors.left: but1.right
height: root.height/2
width: root.width/2
onClicked: {
pageLoader.setSource("StartStateContent.qml", {"myColor": "green"}, {"myTextColor" : "green"})
console.log("button green clicked")
}
}
DSM.StateMachine{
id: stateMachine
initialState: startState
running:true
onStarted: {
pageLoader.setSource("StartStateContent.qml", {"myColor": "blue"}, {"myTextColor" : "orange"})
console.log("App started")
}
Здесь я пытаюсь установить только цвет и text.color, но раньше я пытался изменить размер текста прямоугольник слишком , Сначала я попытался написать {"height" : 100}
. Затем {"height" : "100"}
, {"height" = 100}
и т. Д. Затем я добавил свойство myHeight
(прокомментировал первый файл), но не повезло. Затем я сделал то же самое с текстом. Позже я попытался создать свойство псевдонима текста. Я сделал это для каждой собственности (но сократил это из этого примера, чтобы освободить место), без каких-либо успехов. Конечно, я изменил и якоря погрузчика. Я попытался использовать якоря, чтобы использовать явно установленные x, y, width, height; использовать центрирование. Независимо от попыток, именно то, что меняется, когда я нажимаю кнопки, это цвет прямоугольника. К сожалению, единственный пример использования Loader со свойствами в официальной документации Qt изменяет только свойство цвета, поэтому мне это не помогает.
Мой вопрос: как я могу изменить свойства (кроме цвета) загруженного объекта, используя метод Loader.setProperty()
? Заранее спасибо.
Btw, это мое первое сообщение здесь, так что Hello Qt World :) И извините за возможные языковые ошибки, так как английский не мой родной язык.
Я также отредактировал ваш ответ, но, пожалуйста, не забудьте использовать инструменты форматирования кода в следующий раз. – MayeulC
Да, свойства - один сплошной объект. Вы также можете использовать элемент 'Binding {}'. – dtech