我想浏览QML组件列表并选择一种类型:
for (var i = 0; i < controls.children.length; ++i) {
if ( typeof (controls.children[i].height) == "QDeclarativeRectangle")
{
// do stuff
}
}
如何实现这一目标?
答案 0 :(得分:18)
您不能直接使用 typeof ,因为它总是会将'object'作为任何QML元素的类型返回给您。但是你可以使用几种替代方案。一种是将每个元素的 objectName 设置为其类型,并在循环中检查或定义属性并检查该属性。这将需要更多的工作,但你可以创建具有此属性的qml元素,而不是在需要它的地方使用它。 以下是示例代码:
Rectangle {
id: main
width: 300; height: 400
Rectangle {
id: testRect
objectName: "rect"
property int typeId: 1
}
Item {
id: testItem
objectName: "other"
}
Component.onCompleted: {
for(var i = 0; i < main.children.length; ++i)
{
if(main.children[i].objectName === "rect")
{
console.log("got one rect")
}
else
{
console.log("non rect")
}
}
for(i = 0; i < main.children.length; ++i)
{
if(main.children[i].typeId === 1)
{
console.log("got one rect")
}
else
{
console.log("non rect")
}
}
}
}
答案 1 :(得分:11)
这是使用toString()的另一种方法(可能无法移植到未来版本的QML):
function qmltypeof(obj, className) { // QtObject, string -> bool
// className plus "(" is the class instance without modification
// className plus "_QML" is the class instance with user-defined properties
var str = obj.toString();
return str.indexOf(className + "(") == 0 || str.indexOf(className + "_QML") == 0;
}
...
for (var i = 0; i < controls.children.length; ++i) {
if (qmltypeof(controls.children[i].height, "QDeclarativeRectangle"))
{
// do stuff
}
}
答案 2 :(得分:9)
从Qt 5.10开始,您最终可以使用 instanceOf 来检查变量是否属于某种QML类型:https://v-play.net/updates/v-play-2-15-0-qt-5-10-qt-creator-4-5-support-firebase-data-structures-and-queries#qt-5-10-qml-enum-instanceof
import VPlayApps 1.0
import QtQuick 2.0
App {
// two QML items, used for type checking
Item { id: testItem }
Rectangle { id: testRect }
// function to check wheter an item is a Rectangle
function isRectangle(item) {
return item instanceof Rectangle
}
// type check example
Component.onCompleted: {
console.log("testItem is Rectangle? "+isRectangle(testItem))
console.log("testRect is Rectangle? "+isRectangle(testRect))
}
}
答案 3 :(得分:0)
是的,这个帖子已经2岁了,但也许我的回答可以帮助那里的人。
对我而言,使用JSON.stringify()
来比较QML元素已经足够了。当然,如果两个不同的元素具有完全相同的属性和值,这将给你误报。 (例如,当一个元素在另一个元素的顶部,具有相同的颜色,x,y等时)
toString()对我来说不起作用,因为我已从同一个基本组件创建了许多实例。将 objectName 设置为每个实例对我的用例来说有点太多了。