2012-10-24 36 views
8

我们需要开发一个QtQuick项目,我们有大约100个屏幕。QML:从设计感知的qml页面之间的导航

我曾尝试为按钮单击上有三个屏幕的导航进行演示项目。我在页面之间的导航中使用了“国家”的概念。最初,我使用'Loader'尝试了相同的功能,但是加载程序无法保留之前的页面状态,它在导航期间重新加载整个页面。

下面是main.qml

// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 
import QtQuick 1.1 

Rectangle { 
    id:main_rectangle 
    width: 360 
    height: 640 

    Page1{ 
     id:page1 
    } 

    Page2{ 
     id:page2 
    } 

    Page3{ 
     id:page3 
    } 

    states: [ 
     State { 

      name: "page2" 

      PropertyChanges { target: page3; visible:false; } 
      PropertyChanges { target: page1; visible:false; } 
      PropertyChanges { target: page2; visible:true; } 
     }, 
     State { 
      name: "page1" 
      PropertyChanges { target: page3; visible:false; } 
      PropertyChanges { target: page2; visible:false; } 
      PropertyChanges { target: page1; visible:true; } 
     }, 

     State { 
      name: "page3" 
      PropertyChanges { target: page1; visible:false; } 
      PropertyChanges { target: page2; visible:false; } 
      PropertyChanges { target: page3; visible:true; } 
     } 

    ] 

} 

的代码片断这与小POC与三分屏运行良好,但它不是可行的定义100米的屏幕状态。

从设计方面来看,我们总结出一个C++控制器,它控制着各种页面的状态和可见性。

需要建议如何在C++中实现'状态'逻辑。

+0

你的目标平台是什么? –

+0

目前我们针对的是Windows – DNamto

+0

我的意思是我们针对的是目前Windows上的桌面版本 – DNamto

回答

1

我建议使用Qt Quick Components的StackView。其文档是Here

+0

我知道的是PageStack是专门针对Symbian平台的。它可以在Windows操作系统上的桌面平台上工作吗? – DNamto

+0

如果您的导航模式看起来像在手机中,我认为可以使用它。在我现在下载的桌面Qt Quick组件中,我只看到一个“视图管理器” - TabBar。 –

+0

我可以从经验中得知,PageStack可以在这里定义为一个解决方案。但是,这不是一个非常复杂的控制,你总是可以考虑实现你自己的。基本上你创建一个父对象,它有一个数组作为页面堆栈,并且你使用QML动态对象创建来创建页面,并根据需要将它们推送到堆栈上。我强烈建议查看组件中的PageStack代码。它根本不是很复杂,我的灵感来源于你。 – Deadron

6

这是简单QML中最简单的解决方案,它使用可配置的页面列表(如模型)+ Repeater + Loader项目在启动时不加载所有内容(懒惰实例),并且在隐藏页面后不破坏页面如果我们回到它必须重新加载它):

import QtQuick 1.1 

Rectangle { 
    id: main_rectangle; 
    width: 360; 
    height: 640; 

    // Put the name of the QML files containing your pages (without the '.qml') 
    property variant pagesList : [ 
     "Page1", 
     "Page2", 
     "Page3", 
     "Page4", 
     "Page5" 
    ]; 

    // Set this property to another file name to change page 
    property string currentPage : "Page1"; 

    Repeater { 
     model: pagesList; 
     delegate: Loader { 
      active: false; 
      asynchronous: true; 
      anchors.fill: parent; 
      visible: (currentPage === modelData); 
      source: "%1.qml".arg(modelData) 
      onVisibleChanged:  { loadIfNotLoaded(); } 
      Component.onCompleted: { loadIfNotLoaded(); } 

      function loadIfNotLoaded() { 
       // to load the file at first show 
       if (visible && !active) { 
        active = true; 
       } 
      } 
     } 
    } 
} 

希望它有帮助!

+1

为了更进一步,您可以使用'visible'属性替换自定义属性,让我们假设'shown'将与'scale'或'opacity'和一些'Behavior {}组件一起使用,以创建漂亮的页面更改转换... – TheBootroo

+1

如果页面的QML文件不在同一个文件夹中,则需要在数组中的页面文件名称和“currentPage”属性前提供相对路径: - 如果在子文件夹中:“文件夹名/文件名” - 如果在父文件夹中:“../文件夹/文件名” - 最终是绝对路径,但不是一个好主意! – TheBootroo

+0

Bootroo的答案不会在Quick 2中编译。下面是更改:'main_rectangle.currentPage'和'main_rectangle.pagesList',看起来像变量现在的作用域。希望这可以帮助某人。 –