QML使用loader加载qml文件到QML

转自: http://blog.chinaunix.net/uid-26126915-id-4366840.html


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

 

1、

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

 

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

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

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

 

 

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

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

 

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

 

 

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

 

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

 如果在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.   
  5. Item {  
  6.     property bool isFirst : false;  
  7.     width200  
  8.     height200  
  9.   
  10.     Loader {  
  11.         id: pageLoader  
  12.         source: "Page2.qml"  
  13.         focus: true  
  14.         onStatusChanged:  console.log(pageLoader.status == Loader.Ready)  
  15.         onLoaded: console.log("Loaded")  
  16.     }  
  17.   
  18.     MouseArea {  
  19.         anchors.fill: parent  
  20.         onClicked: changePage();  
  21.     }  
  22.   
  23.     function changePage() {  
  24.         if(isFirst) {  
  25.             pageLoader.source = "Page1.qml"  
  26.         } else {  
  27.             pageLoader.source = "Page2.qml"  
  28.         }  
  29.   
  30.         isFirst = !isFirst;  
  31.     }  
  32.   
  33.     Component {  
  34.         id: rect  
  35.         Rectangle {  
  36.             width200  
  37.             height50  
  38.             color"red"  
  39.             Text {  
  40.                 text: "Default Page"  
  41.                 anchors.fill: parent  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46.     Keys.onPressed: {  
  47.         console.log("Captured: ", event.text);  
  48.          event.accepted = true;  
  49.     }  
  50.   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML Loader加载QML文件时,该文件中的所有元素和属性都会被解析和加载。在加载过程中,QML解释器会按照元素在文件中的顺序执行相应的构造函数和属性设置函数。具体来说,以下是QML加载过程中可能会执行的函数: 1. 构造函数:每个元素都有一个对应的构造函数,用于创建该元素的实例。当QML解释器读取到一个元素时,会立即调用该元素的构造函数,创建一个实例对象。例如: ``` Rectangle { width: 100 height: 100 } ``` 在这个例子中,QML解释器会调用Rectangle元素的构造函数,创建一个Rectangle实例对象。 2. 初始化函数:一些元素在创建实例后需要执行一些初始化操作,例如设置一些默认属性值或者连接一些信号槽。这些初始化操作通常在元素的Component.onCompleted信号中进行。例如: ``` Rectangle { width: 100 height: 100 Component.onCompleted: { console.log("Rectangle initialized") } } ``` 在这个例子中,QML解释器会在创建Rectangle实例后,调用Rectangle元素的Component.onCompleted信号中的函数,输出"Rectangle initialized"。 3. 属性设置函数:当QML解释器读取到一个元素的属性时,会立即调用该属性对应的设置函数,对元素实例的属性进行设置。例如: ``` Rectangle { width: 100 height: 100 } Text { text: "Hello World" font.pixelSize: 12 } ``` 在这个例子中,QML解释器会先创建一个Rectangle实例对象,然后创建一个Text实例对象。在创建Text实例对象时,QML解释器会先调用text属性的设置函数,将文本内容设置为"Hello World",然后调用font.pixelSize属性的设置函数,将字体大小设置为12像素。 总之,QML Loader加载QML文件时,会按照元素在文件中的顺序执行构造函数、初始化函数和属性设置函数,完成所有元素的创建和初始化工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值