呵呵,今晚是边看《裸婚时代》边敲代码,那电影看得...!钱真他妈不是个东西.

盼望Meego火起来。

QML的Loader元素经常备用来动态加载QML组件。可以使用source属性或者sourceComponent属性加载。这个元素最有用的地方是它能在qml组件需要的时候再创建,即延迟创建QML的时间。

1、

  1. main.qml
  2. ------------------------------------
  3. import QtQuick 1.0
  4. Item {
  5. property bool isFirst : false;
  6. width: 200
  7. height: 200
  8. Loader {
  9. id: pageLoader
  10. }
  11. MouseArea {
  12. anchors.fill: parent
  13. onClicked: changePage();
  14. }
  15. function changePage() {
  16. if(isFirst) {
  17. pageLoader.source = "Page1.qml"
  18. } else {
  19. pageLoader.source = "Page2.qml"
  20. }
  21. isFirst = !isFirst;
  22. }
  23. }
  24. Page1.qml
  25. -------------------------------------
  26. import QtQuick 1.0
  27. Rectangle {
  28. width: 100
  29. height: 62
  30. Text {
  31. anchors.centerIn: parent
  32. text: "Page1 Test"
  33. }
  34. }
  35. Page2.qml
  36. ---------------------------------------
  37. import QtQuick 1.0
  38. Rectangle {
  39. width: 100
  40. height: 62
  41. Text {
  42. anchors.centerIn: parent
  43. text: "Page1 Test"
  44. }
  45. }

2、上面的代码就能界面在Page1和Page2之间切换了,别忘了还能使用sourceComponent属性:

  1. main.qml
  2. --------------------------------------
  3. import QtQuick 1.0
  4. Item {
  5. property bool isFirst : false;
  6. width: 200
  7. height: 200
  8. Loader {
  9. id: pageLoader
  10. sourceComponent: rect
  11. }
  12. MouseArea {
  13. anchors.fill: parent
  14. onClicked: changePage();
  15. }
  16. function changePage() {
  17. if(isFirst) {
  18. pageLoader.source = "Page1.qml"
  19. } else {
  20. pageLoader.source = "Page2.qml"
  21. }
  22. isFirst = !isFirst;
  23. }
  24. Component {
  25. id: rect
  26. Rectangle {
  27. width: 200
  28. height: 50
  29. color: "red"
  30. Text {
  31. text: "Default Page"
  32. anchors.fill: parent
  33. }
  34. }
  35. }
  36. }

上面的代码实现了默认加载组件功能.

3、接收来自加载的qml发出的信号

使用Connections元素可以接收到任何发送自加载组件的信号。

  1. main.qml
  2. ---------------------------------------
  3. import QtQuick 1.0
  4. Item {
  5. property bool isFirst : false;
  6. width: 200
  7. height: 200
  8. Loader {
  9. id: pageLoader
  10. source: "Page1.qml"
  11. }
  12. Connections {
  13. target: pageLoader.item
  14. onMessage: console.log(msg);
  15. }
  16. }
  17. Page1.qml
  18. ----------------------------------------------
  19. import QtQuick 1.0
  20. Rectangle {
  21. id: myItem
  22. signal message(string msg)
  23. width: 100; height: 100
  24. MouseArea {
  25. anchors.fill: parent
  26. onClicked: myItem.message("clicked!");
  27. }
  28. }

4、加载与被加载组件中都有相同的事件,那么需要设置Loader的属性focus为true,且设置被加载组件 focus: true才能让事件不被传播到被加载组件。

  1. main.qml
  2. -------------------------------------
  3. import QtQuick 1.0
  4. Item {
  5. property bool isFirst : false;
  6. width: 200
  7. height: 200
  8. Loader {
  9. id: pageLoader
  10. source: "Page2.qml"
  11. focus: true
  12. }
  13. Keys.onPressed: {
  14. console.log("Captured: ", event.text);
  15. event.accepted = true;
  16. }
  17. }
  18. Page2.qml
  19. ---------------------------------
  20. import QtQuick 1.0
  21. Rectangle {
  22. width: 100
  23. height: 62
  24. Text {
  25. anchors.centerIn: parent
  26. text: "Page2 Test"
  27. }
  28. focus: true
  29. Keys.onPressed: {
  30. console.log("Loaded item captured: ", event.text);
  31. event.accepted = true;
  32. }
  33. }

如果在Page2.qml中去掉event.accepted = true;那么main.qml和Page2.qml都会接收到按键事件,也就是说按键事件会传播到main.qml中

5、Loader的 onStatusChanged和onLoaded事件

  1. main.qml
  2. -------------------------------------
  3. import QtQuick 1.0
  4. Item {
  5. property bool isFirst : false;
  6. width: 200
  7. height: 200
  8. Loader {
  9. id: pageLoader
  10. source: "Page2.qml"
  11. focus: true
  12. onStatusChanged:  console.log(pageLoader.status == Loader.Ready)
  13. onLoaded: console.log("Loaded")
  14. }
  15. MouseArea {
  16. anchors.fill: parent
  17. onClicked: changePage();
  18. }
  19. function changePage() {
  20. if(isFirst) {
  21. pageLoader.source = "Page1.qml"
  22. } else {
  23. pageLoader.source = "Page2.qml"
  24. }
  25. isFirst = !isFirst;
  26. }
  27. Component {
  28. id: rect
  29. Rectangle {
  30. width: 200
  31. height: 50
  32. color: "red"
  33. Text {
  34. text: "Default Page"
  35. anchors.fill: parent
  36. }
  37. }
  38. }
  39. Keys.onPressed: {
  40. console.log("Captured: ", event.text);
  41. event.accepted = true;
  42. }
  43. }

QML之使用Loader加载QML组件的更多相关文章

  1. QML中文件的加载(三种方法)

    在这里小小总结一下QML文件中如何加载QML文件与JavaScript文件. 1.QML文件中加载JavaScript文件 语法: import <ModuleIdentifier> &l ...

  2. Vue动态加载异步组件

    背景: 目前我们项目都是按组件划分的,然后各个组件之间封装成产品.目前都是采用iframe直接嵌套页面.项目中我们还是会碰到一些通用的组件跟业务之间有通信,这种情况下iframe并不是最好的选择,if ...

  3. as3 Loader 加载资源后内存泄露无法释放的问题。

    本人用Loader加载外部一个swf.之后unloadAndStop,Flash概要分析发现,内存没有被释放. 网上搜了一大堆文章,要么就是加载bitmapdata之后,自己dispose,要么就是加 ...

  4. Loader加载器

    今天学到了这个Loader,浅谈一下自己的看法: 1.定义 Loader是一个加载器,可以用来它访问数据,可以看做访问数据的机器(好比挖掘机).装再器从android3.0开始引进,它使得在activ ...

  5. [ActionScript 3.0] AS3.0 Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain

    实际应用中, Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain,需要择情况而定. 1.如果在本地将项目位置添加到flashplayer受信任位置(上一篇文章所述) ...

  6. (转载)Flash Loader加载完成不发送COMPLETE和ERROR事件的问题分析

    (转载)http://blog.dou.li/flash-loader%E5%8A%A0%E8%BD%BD%E5%AE%8C%E6%88%90%E4%B8%8D%E5%8F%91%E9%80%81co ...

  7. 1.引入必要的文件 2.加载 UI 组件的方式 4.Parser 解析器

    //引入 jQuery 核心库,这里采用的是 2.0 <scripttype="text/javascript"src="easyui/jquery.min.js& ...

  8. win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题。取消安装。”处理方法

    win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题.取消安装.”处理方法 vs2008试用期到期,卸载.重新安装都会出现“ 加载安装组件时遇到问题.取消安装.”无 ...

  9. netcore实践:跨平台动态加载native组件

    缘起netcore框架下实现基于zmq的应用. 在.net framework时代,我们进行zmq开发由很多的选择,比较常用的有clrzmq4和NetMQ. 其中clrzmq是基于libzmq的Int ...

随机推荐

  1. GBDT详解

    GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决 ...

  2. WOT2016大数据技术峰会——千人技术盛宴

    WOT2016大数据技术峰会是一场聚焦大数据领域最前沿的的技术及经验分享.2016年11月25-26日北京粤财JW万豪酒店如约而至,会议规模达到1000人! 由51CTO主办的千人技术盛宴--WOT2 ...

  3. 用户代理检测与浏览器Ua详细分析

    用户代理检测与浏览器Ua详细分析:http://www.cnblogs.com/hykun/p/Ua.html

  4. POJ 3026 Borg Maze(Prim+BFS建邻接矩阵)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  5. CF #368 div2

    题目链接:http://codeforces.com/contest/707/problem/A A. Brain's Photos time limit per test 2 seconds mem ...

  6. [ An Ac a Day ^_^ ] hdu 5835 Danganronpa 令人发指

    这道题告诉我两个道理: 1.记得写case 要不挂死你 2.数据很水的时候 只有样例的这一种情况…… 原来数据可以这么水…… #include<stdio.h> #include<i ...

  7. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

  8. 表单提交是ajax提交,PC提交没问题但是手机提交就会一直跳到error,并且也没状态码一直是0

    真是被自己蠢死了button标签他会自动提交刷新页面 <form id="baoming_from"> <p>请填写您的个人信息</p> < ...

  9. 斯坦福大学公开课:iOS 7应用开发 笔记

    2015-07-06 第一讲   课务.iOS概述 -------------------------------------------------- 开始学习斯坦福大学公开课:iOS 7应用开发留 ...

  10. C++中的向上类型转换和向下类型转换

    在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换. 向上强制类型转换 切割:覆盖方法和子类数据丢失的现象生成切割(slice) class ...