javascript - for 循环中的 Qt.bound

标签 javascript qt qml qt5 qtquick2

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)表达式中,newTabthis 替换。灵感来自this .

显然使用 this 消除了歧义,Qt.binding() 确切地知道要引用哪个 newTab

关于javascript - for 循环中的 Qt.bound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33712000/

相关文章:

android - 如何更改qt android应用程序的默认应用程序图像

javascript - 有没有一种方法可以在实时数据库中搜索特定的子值并提取其附带的其余子数据

javascript - 如何在不使用 clojurescript 中的事件循环的情况下运行长时间的计算?

c++ - 初始化中的指针转换

c++ - 在 Qt 中注册自定义 MetaType 的别名类型

qt - 从 QML url 获取路径

javascript - Google Geocoding - 抓取地址和坐标

javascript - 访问部分 javascript 数组 (mysqljs)

c++ - 如何使 QComboBox 的文本加粗,而不是列表项?

qt - 如何从 QML 检测 dataChanged() 和 resourcesChanged()