2016-09-23 4 views
1

Я хочу написать приложение в 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 :) И извините за возможные языковые ошибки, так как английский не мой родной язык.

ответ

2

Я получил ответ от официального QtForum:

Вместо использования

pageLoader.setSource("StartStateContent.qml", {"myColor": "red"}, {"myTextColor" : "white"}) 

следует использовать

pageLoader.setSource("StartStateContent.qml", {"myColor": "red", "myTextColor" : "white"}) 

, так как метод setSource ожидает объект. Работает на 100%!

+0

Я также отредактировал ваш ответ, но, пожалуйста, не забудьте использовать инструменты форматирования кода в следующий раз. – MayeulC

+0

Да, свойства - один сплошной объект. Вы также можете использовать элемент 'Binding {}'. – dtech

 Смежные вопросы

  • Нет связанных вопросов^_^