QML之使用Loader加载QML组件
呵呵,今晚是边看《裸婚时代》边敲代码,那电影看得...!钱真他妈不是个东西.
盼望Meego火起来。
QML的Loader元素经常备用来动态加载QML组件。可以使用source属性或者sourceComponent属性加载。这个元素最有用的地方是它能在qml组件需要的时候再创建,即延迟创建QML的时间。
1、
- main.qml
- ------------------------------------
- import QtQuick 1.0
- Item {
- property bool isFirst : false;
- width: 200
- height: 200
- Loader {
- id: pageLoader
- }
- MouseArea {
- anchors.fill: parent
- onClicked: changePage();
- }
- function changePage() {
- if(isFirst) {
- pageLoader.source = "Page1.qml"
- } else {
- pageLoader.source = "Page2.qml"
- }
- isFirst = !isFirst;
- }
- }
- Page1.qml
- -------------------------------------
- import QtQuick 1.0
- Rectangle {
- width: 100
- height: 62
- Text {
- anchors.centerIn: parent
- text: "Page1 Test"
- }
- }
- Page2.qml
- ---------------------------------------
- import QtQuick 1.0
- Rectangle {
- width: 100
- height: 62
- Text {
- anchors.centerIn: parent
- text: "Page1 Test"
- }
- }
2、上面的代码就能界面在Page1和Page2之间切换了,别忘了还能使用sourceComponent属性:
- main.qml
- --------------------------------------
- import QtQuick 1.0
- Item {
- property bool isFirst : false;
- width: 200
- height: 200
- Loader {
- id: pageLoader
- sourceComponent: rect
- }
- MouseArea {
- anchors.fill: parent
- onClicked: changePage();
- }
- function changePage() {
- if(isFirst) {
- pageLoader.source = "Page1.qml"
- } else {
- pageLoader.source = "Page2.qml"
- }
- isFirst = !isFirst;
- }
- Component {
- id: rect
- Rectangle {
- width: 200
- height: 50
- color: "red"
- Text {
- text: "Default Page"
- anchors.fill: parent
- }
- }
- }
- }
上面的代码实现了默认加载组件功能.
3、接收来自加载的qml发出的信号
使用Connections元素可以接收到任何发送自加载组件的信号。
- main.qml
- ---------------------------------------
- import QtQuick 1.0
- Item {
- property bool isFirst : false;
- width: 200
- height: 200
- Loader {
- id: pageLoader
- source: "Page1.qml"
- }
- Connections {
- target: pageLoader.item
- onMessage: console.log(msg);
- }
- }
- Page1.qml
- ----------------------------------------------
- import QtQuick 1.0
- Rectangle {
- id: myItem
- signal message(string msg)
- width: 100; height: 100
- MouseArea {
- anchors.fill: parent
- onClicked: myItem.message("clicked!");
- }
- }
4、加载与被加载组件中都有相同的事件,那么需要设置Loader的属性focus为true,且设置被加载组件 focus: true才能让事件不被传播到被加载组件。
- main.qml
- -------------------------------------
- import QtQuick 1.0
- Item {
- property bool isFirst : false;
- width: 200
- height: 200
- Loader {
- id: pageLoader
- source: "Page2.qml"
- focus: true
- }
- Keys.onPressed: {
- console.log("Captured: ", event.text);
- event.accepted = true;
- }
- }
- Page2.qml
- ---------------------------------
- import QtQuick 1.0
- Rectangle {
- width: 100
- height: 62
- Text {
- anchors.centerIn: parent
- text: "Page2 Test"
- }
- focus: true
- Keys.onPressed: {
- console.log("Loaded item captured: ", event.text);
- event.accepted = true;
- }
- }
如果在Page2.qml中去掉event.accepted = true;那么main.qml和Page2.qml都会接收到按键事件,也就是说按键事件会传播到main.qml中
5、Loader的 onStatusChanged和onLoaded事件
- main.qml
- -------------------------------------
- import QtQuick 1.0
- Item {
- property bool isFirst : false;
- width: 200
- height: 200
- Loader {
- id: pageLoader
- source: "Page2.qml"
- focus: true
- onStatusChanged: console.log(pageLoader.status == Loader.Ready)
- onLoaded: console.log("Loaded")
- }
- MouseArea {
- anchors.fill: parent
- onClicked: changePage();
- }
- function changePage() {
- if(isFirst) {
- pageLoader.source = "Page1.qml"
- } else {
- pageLoader.source = "Page2.qml"
- }
- isFirst = !isFirst;
- }
- Component {
- id: rect
- Rectangle {
- width: 200
- height: 50
- color: "red"
- Text {
- text: "Default Page"
- anchors.fill: parent
- }
- }
- }
- Keys.onPressed: {
- console.log("Captured: ", event.text);
- event.accepted = true;
- }
- }
QML之使用Loader加载QML组件的更多相关文章
- QML中文件的加载(三种方法)
在这里小小总结一下QML文件中如何加载QML文件与JavaScript文件. 1.QML文件中加载JavaScript文件 语法: import <ModuleIdentifier> &l ...
- Vue动态加载异步组件
背景: 目前我们项目都是按组件划分的,然后各个组件之间封装成产品.目前都是采用iframe直接嵌套页面.项目中我们还是会碰到一些通用的组件跟业务之间有通信,这种情况下iframe并不是最好的选择,if ...
- as3 Loader 加载资源后内存泄露无法释放的问题。
本人用Loader加载外部一个swf.之后unloadAndStop,Flash概要分析发现,内存没有被释放. 网上搜了一大堆文章,要么就是加载bitmapdata之后,自己dispose,要么就是加 ...
- Loader加载器
今天学到了这个Loader,浅谈一下自己的看法: 1.定义 Loader是一个加载器,可以用来它访问数据,可以看做访问数据的机器(好比挖掘机).装再器从android3.0开始引进,它使得在activ ...
- [ActionScript 3.0] AS3.0 Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain
实际应用中, Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain,需要择情况而定. 1.如果在本地将项目位置添加到flashplayer受信任位置(上一篇文章所述) ...
- (转载)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 ...
- 1.引入必要的文件 2.加载 UI 组件的方式 4.Parser 解析器
//引入 jQuery 核心库,这里采用的是 2.0 <scripttype="text/javascript"src="easyui/jquery.min.js& ...
- win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题。取消安装。”处理方法
win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题.取消安装.”处理方法 vs2008试用期到期,卸载.重新安装都会出现“ 加载安装组件时遇到问题.取消安装.”无 ...
- netcore实践:跨平台动态加载native组件
缘起netcore框架下实现基于zmq的应用. 在.net framework时代,我们进行zmq开发由很多的选择,比较常用的有clrzmq4和NetMQ. 其中clrzmq是基于libzmq的Int ...
随机推荐
- 九章lintcode作业题
1 - 从strStr谈面试技巧与代码风格 必做题: 13.字符串查找 要求:如题 思路:(自写AC)双重循环,内循环读完则成功 还可以用Rabin,KMP算法等 public int strStr( ...
- Python读取ini配置文件
db_config.ini [baseconf] host=127.0.0.1 port=3306 user=root password=root db_name=evaluting_sys [con ...
- java 导出excel(复杂案例)
import java.io.FileOutputStream;import java.io.IOException; import org.apache.poi.hssf.usermodel.HSS ...
- hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...
- 如何在网页标题栏title加入logo图标?
打开某一个网页会在浏览器的标签栏处显示该网页的标题和图标,当网页被添加到收藏夹或者书签中时也会出现网页的图标,怎么在网页title左边显示网页的logo图标呢? 方法一(被动式): 制作一个ico格式 ...
- HttpModule的基本概念
注:本文为个人学习摘录,原文地址:http://www.cnblogs.com/stwyhm/archive/2006/08/09/471765.html HttpModule是如何工作的 当一个HT ...
- Android 切横竖屏时走的生命周期方法?222
第一种情况: 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 第二种情况: 设置Activity的androi ...
- MVC3+EF4.1学习系列(八)-----利用Repository and Unit of Work重构项目
项目最基础的东西已经结束了,但是现在我们的项目还不健全 不利于测试 重复性代码多 层与层之间耦合性高 不利于扩展等问题.今天的这章 主要就是解决这些问题的.再解决这些问题时,自己也产生了很多疑 ...
- LeetCode OJ 45. Jump Game II
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Gentoo网络配置
网卡识别配置 要开始配置你的网卡,你首先需要告诉Gentoo RC系统你的网卡. 可以用ifconfig命令查看自己网卡名字: ifconfig -a 网卡名字(如eth0)的识别是通过在/etc/i ...