我是Qt Quck和Qt5 / PyQt的新手,现在我遇到了一个奇怪的问题。我正试图在下面的QML定义中找到一个objectName为“test”的对象,如下所示:
self.rootObject().findChild(QObject, "test")
但是呼叫返回None。但是,如果我将objectName: "test"
属性移动到父Tab元素,则会成功找到它。它只在孩子Item
内找不到。同样,addChannel
也找不到modifyChannel
,removeChannel
和findChild()
个对象。
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.1
import "TouchStyles"
Item {
ListModel { }
TouchButtonFlatStyle { id: touchButtonFlat }
TouchTabViewStyle { id: touchTabView }
Rectangle {
width: 480
height: 230
TabView {
currentIndex: 0
tabPosition: 1
anchors.fill: parent
style: touchTabView
Tab {
title: "Play"
Item {
anchors.fill: parent
PianoKeyboard { anchors.centerIn: parent }
}
}
Tab {
title: "Channels"
Item {
objectName: "test"
ListView {
anchors.fill: parent
model: listModel
delegate: Channel {}
}
BorderImage {
border.bottom: 8
anchors.bottom: parent.bottom
source: "images/toolbar.png"
width: parent.width
height: 50
RowLayout {
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
Button { text: "Add"; objectName: "addChannel" }
Button { text: "Modify"; objectName: "modifyChannel" }
Button { text: "Remove"; objectName: "removeChannel" }
}
}
}
}
}
}
}
我做错了什么? Qt文档说,搜索是递归执行的。为什么不遍历整个对象树?
答案 0 :(得分:3)
问题与选项卡仅在需要时“实例化”的事实有关。第一个选项卡始终是实例化的,因此如果您将objectName
置于其中,则会找到它。
仅当您实例化第二个选项卡(选择它)时,才会在第二个选项卡中找到它。类似地,在findChild
上使用TabView
可能会实例化每个选项卡(因为它正在查找它们),因此即使没有选择第二个选项卡,findChild
也可以工作。
结论:首先实例化所有标签(在findChild
上执行TabView
是单向但可能是黑客攻击),然后对项目执行findChild
。