在 TabView
中,我尝试从字符串属性加载 Tab
项目列表:
TabView {
id: tabView1
property string tabs: "/etc,/bin"
function loadTabs() {
var tab_array = tabs.split(",");
for (var i = 0; i < tab_array.length; i ++) {
var dirTableView = Qt.createComponent("dirview.qml");
var newTab = tabView1.addTab("", dirTableView);
newTab.active = true;
newTab.item.folderUrl = "file://" + tab_array[i];
newTab.title = Qt.binding(function() {
return newTab.item.folderUrl.toString().replace("file://", "");
});
}
}
Component.onCompleted: {
loadTabs();
}
}
每个 Tab
加载目录内容的 TableView
(如 dirview.qml
中指定)。
Tab.title
绑定(bind)不起作用,因为 newTab
在每次迭代中都会被重新分配给不同的 Tab
,因此结果是所有选项卡的标题都绑定(bind)到最后选项卡的标题。
我尝试使用数组来存储 TabView.addTab()
返回的不同 Tab
项:
property var tabArray: []
function loadTabs() {
var tab_array = tabs.split(",");
for (var i = 0; i < tab_array.length; i ++) {
var dirTableView = Qt.createComponent("dirview.qml");
tabArray[i] = tabView1.addTab("", dirTableView);
tabArray[i].active = true;
tabArray[i].item.folderUrl = "file://" + tab_array[i];
tabArray[i].title = Qt.binding(function() {
return tabArray[i].item.folderUrl.toString().replace("file://", "");
});
}
}
但这也行不通。显然,一旦声明数组,就会触发 Qt.binding() ,但那时数组是空的,因此我收到错误“无法读取未定义的属性'item'”(引用到Qt.binding()
)。奇怪的是,不知何故,应用程序启动时标题被正确设置,但是当我在目录树中导航时 item.folderUrl
发生变化时,标题不会相应更新,因此绑定(bind)不起作用。
在 for 循环中正确执行 Qt.binding
的方法是什么?
最佳答案
刚刚又尝试了一件小事,它成功了!
function loadTabs() {
var tab_array = tabs.split(",");
for (var i = 0; i < tab_array.length; i ++) {
var dirTableView = Qt.createComponent("dirview.qml");
var newTab = tabView1.addTab("", dirTableView);
newTab.active = true;
newTab.item.folderUrl = "file://" + tab_array[i];
newTab.title = Qt.binding(function() {
return this.item.folderUrl.toString().replace("file://", "");
});
}
}
唯一的更改是在绑定(bind)表达式中,newTab
被 this
替换。灵感来自this .
显然使用 this
消除了歧义,Qt.binding()
确切地知道要引用哪个 newTab
。
关于javascript - for 循环中的 Qt.bound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33712000/