我想在QtQuick中编写一个动态加载内容的应用程序。我决定使用Loader。现在我遇到了一个问题,这让我感到震惊。我以为我会花两分钟时间,但我花了两天时间,我的问题仍未得到解决。
我想在单击按钮时从.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")
}
这里我尝试只设置color和text.color,但是之前我也尝试更改文本矩形大小。起初,我试着写{"height" : 100}
。然后是{"height" : "100"}
,{"height" = 100}
等。然后我添加了属性myHeight
(在第一个文件中注释),但没有运气。然后我做了相同的文字。后来我尝试创建一个文本的别名属性。我对每个房产都这样做了(但是从那个例子中删除了空间),没有任何成功。当然我也改变了装载机的锚点。我尝试使用锚点,明确设置x,y,width,height;使用居中。独立于尝试,单击按钮时正在改变的是矩形的颜色。不幸的是,在官方Qt文档中使用Loader和属性的唯一例子只改变了color属性,所以它对我没有帮助。
我的问题是:如何使用Loader.setProperty()
方法更改已加载对象的属性(颜色除外)?提前谢谢。
答案 0 :(得分:3)
我从官方QtForum那里得到了答案:
而不是使用
pageLoader.setSource("StartStateContent.qml", {"myColor": "red"}, {"myTextColor" : "white"})
应该使用
pageLoader.setSource("StartStateContent.qml", {"myColor": "red", "myTextColor" : "white"})
因为setSource
方法需要一个对象。这样100%工作!