QML中的树遍历,检查QModelIndex是否有效
Tree traversal in QML, checking if QModelIndex isValid
为了扩展 TreeView 的节点以显示当前选定的项目(由共享选择模型设置),我需要递归调用 TreeView.expand(QModelIndex)。
expand(index)
expand(index.parent)
expand(index.parent.parent)
...
这可以通过这样的函数来完成:
function autoExpand(index ) {
print(index)
var oneUp = index
do {
print(oneUp)
oneUp = index.parent
expand(oneUp)
print("do")
print(oneUp)
} while (oneUp)
}
但是我不知道如何检查根节点。我试过了
while (oneUp) -> always true
while (oneUp.isValid) -> undefined ie always false
while (oneUp.isValid()) -> property isValid cannot be called as a function
,在 C++ 中它将是:
do {
//....
} while (oneUp.isValid());
但是我在 QML 中找不到等效的函数(也不知道去哪里找代码...)
作为一种解决方法,我在一个已经导出的对象中用 C++ 检查了它,但是它看起来不正确:
public slots:
bool indexIsValid(const QModelIndex &index) const {return index.isValid();}
"...\Qt.5\Src\qtquickcontrols\src\controls\TreeView.qml"
function expand(index) {
if (index.valid && index.model !== model)
console.warn("TreeView.expand: model and index mismatch")
else
modelAdaptor.expand(index)
}
作为 zizix 复制粘贴答案的副作用,我了解到 QModelIndex::isValid 函数转换为 QML 中的 index.valid 属性 (?)。使用它,我现在可以在 QML 中成功检测到树的根:
function autoExpand(index ) {
var oneUp = index
do {
oneUp = oneUp.parent
expand(oneUp)
} while (oneUp.valid);
}
为了扩展 TreeView 的节点以显示当前选定的项目(由共享选择模型设置),我需要递归调用 TreeView.expand(QModelIndex)。
expand(index)
expand(index.parent)
expand(index.parent.parent)
...
这可以通过这样的函数来完成:
function autoExpand(index ) {
print(index)
var oneUp = index
do {
print(oneUp)
oneUp = index.parent
expand(oneUp)
print("do")
print(oneUp)
} while (oneUp)
}
但是我不知道如何检查根节点。我试过了
while (oneUp) -> always true
while (oneUp.isValid) -> undefined ie always false
while (oneUp.isValid()) -> property isValid cannot be called as a function
,在 C++ 中它将是:
do {
//....
} while (oneUp.isValid());
但是我在 QML 中找不到等效的函数(也不知道去哪里找代码...)
作为一种解决方法,我在一个已经导出的对象中用 C++ 检查了它,但是它看起来不正确:
public slots:
bool indexIsValid(const QModelIndex &index) const {return index.isValid();}
"...\Qt.5\Src\qtquickcontrols\src\controls\TreeView.qml"
function expand(index) {
if (index.valid && index.model !== model)
console.warn("TreeView.expand: model and index mismatch")
else
modelAdaptor.expand(index)
}
作为 zizix 复制粘贴答案的副作用,我了解到 QModelIndex::isValid 函数转换为 QML 中的 index.valid 属性 (?)。使用它,我现在可以在 QML 中成功检测到树的根:
function autoExpand(index ) {
var oneUp = index
do {
oneUp = oneUp.parent
expand(oneUp)
} while (oneUp.valid);
}