动态添加到 qml tabbar 和 stacklayout

Adding dynamically to qml tabbar and stacklayout

我正在尝试在 qml 中创建标签页。我使用了与 StackLayout 关联的 TabBar:

      TabBar {
      id: bar
      width: parent.width
      TabButton {
          text: qsTr("Home")
      }
      TabButton {
          text: qsTr("Discover")
      }
      TabButton {
          text: qsTr("Activity")
      }
  }

  StackLayout {
      width: parent.width
      currentIndex: bar.currentIndex
      Item {
          id: homeTab
      }
      Item {
          id: discoverTab
      }
      Item {
          id: activityTab
      }
  }

此代码可以轻松地动态添加一个新的 tabButton:

        var tab = tabButton.createObject(TTabButton, {text: tabName});
        bar.addItem(tab);

其中TTabButton是一个单独的文件,由TabButton项组成。但是我找不到任何方法来向 StackLayout 添加新页面。它似乎应该是静态的。所以我的问题是如何在 qml 中进行动态标签页分页?

您可以添加到 StackLayout 的子项:

var item = stackItem.createObject(null, {id: "tabName"})
layout.children.push(item)

其中 stackItem 是您添加到 StackLayout layout 的那些项目的组件。

您可以按照建议直接操作 StackLayoutchildren(或 data)属性,但可能更好的主意是使用 Repeater 结合 ObjectModel:

StackLayout
{
    id: stackLayout
    currentIndex: bar.currentIndex
        
    Repeater
    {
        model: ObjectModel
        {
            id: container
        }
    }
}

通过这种方式,您可以获得比 ObjectModel 更丰富、更轻松的 API:

let tabPage = tabPageComponent.createObject(stackLayout);
container.append(tabPage);

let tabPage2 = tabPageComponent.createObject(stackLayout);
container.insert(0, tabPage2);

container.move(1, 0);
// etc.

这里的一个重要细节是,当删除标签时,有必要手动 destroy() 它,因为 Repeater/ObjectModel 只管理层次结构,而不管理生命周期。

let tabPage = container.get(0);
container.remove(0);
tabPage.destroy();