如何使用 .qml 页面设置容器内容?

Posted

技术标签:

【中文标题】如何使用 .qml 页面设置容器内容?【英文标题】:How can I set container content with a .qml page? 【发布时间】:2013-11-20 16:43:35 【问题描述】:

我正在使用 BB Native SDK 开发一个 Blackberry 10 移动应用程序。

我想要的只是设置一个动态 'Container',它是特定 (.qml) 页面的一部分,如下所示 (ma​​in.qml),它将可以选择填充来自资产的不同 qml 页面(例如“content1.qml”)

这可能吗?如果是这样,我该怎么做?


ma​​in.qml:

import bb.cascades 1.2

Page 
    Container 
        layout: DockLayout 
        //Todo: fill me with QML
      Header 
          title: "Hello Boys  ;)"
          horizontalAlignment: HorizontalAlignment.Fill
          verticalAlignment: VerticalAlignment.Top
      

       Container 
         id: selectedCont
         objectName: "selectedContObj"
       

       Footer 
           title: "Hi Girls  ;)"
           horizontalAlignment: HorizontalAlignment.Fill
           verticalAlignment: VerticalAlignment.Bottom
       

    

content1.qml

Container 
    Label
        text: "Hello World"
    
    Button 
        text: "Submit"
    
    Button 
        text: "Cancel"
    

【问题讨论】:

【参考方案1】:

首先你需要在 content1.qml 中给你的容器一个 id,比如说 id: container1

由于Container是Control(Container继承自Control),您可以简单地将container1添加到selectedCont:

selectedCont.removeAll();
selectedCont.add(content1.container1);

如果您在 selectedCont 中已有容器,也可以使用 replace:

selectedCont.replace(0, content1.container1);

这假设 main.qml 和 content1.qml 在同一个文件夹中。

如果你想从 C++ 中实现相同的效果,你需要使用以下方法加载 qml 文件:

QmlDocument *qml1 = QmlDocument::create("asset:///container1.qml").parent(this);
Container* container1 = qml1->createRootObject<Container>();

要获得指向您的 selectContObj 的指针,您可以这样做:

QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
AbstractPane *root = qml->createRootObject<AbstractPane>();
Container* selectCont = root->findChild<bb::cascades::Container*>("selectContObj");

【讨论】:

谢谢!但是你能解释更多吗?我想用 C++ 来做。 我在答案中添加了 C++。 非常感谢你.. !! ^_^【参考方案2】:

您可以使用 ControlDelegate。这些旨在用 qml 文件替换内容。

Container 
    layout: DockLayout 

  Header 
      title: "Hello Boys  ;)"
      horizontalAlignment: HorizontalAlignment.Fill
      verticalAlignment: VerticalAlignment.Top
  

   ControlDelegate 
        id: selectedContDelegate
    

   Footer 
       title: "Hi Girls  ;)"
       horizontalAlignment: HorizontalAlignment.Fill
       verticalAlignment: VerticalAlignment.Bottom
   


然后在您的按钮或您想要更改的任何地方执行以下操作:

selectedContDelegate.source = "Content1.qml"

【讨论】:

谢谢!但是如何在 C++ 中使用它呢?我找不到包含“ControlDelegate”组件的库的引用 -> 我尝试了这个“bb::cascades::ControlDelegate”,就像link 中提到的那样,但他仍然找不到它 恐怕我只使用了 QML 的方式。我找不到在 c++ 中使用它的任何示例。确保您拥有最新的 10.2 版本的 SDK。如果您使用的是 10.1 或更早版本,它可能不支持 controlDelegate。

以上是关于如何使用 .qml 页面设置容器内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 QML 访问和控制 ListModel 的内容

如何使 QML 容器中的最后一项填充剩余空间?

如何将C ++类设置为qml中的Item?

我应该如何使用React Router来调换我想要在头体和脚中显示的内容?

如何有条件地禁用 QML 绑定到 C++ 后端?

QML:如何通过拖放重新排序中继器项目?里面有一些工作代码