赞
踩
在QML学习和开发过程中,看到Loader的官方介绍之后,发现Loader就是用来动态加载一个qml或者component的容器。
有一个问题在我脑海里冒了出来:loader加载一个qml或者一个组件,完全可以通过设置这个qml或者组件的visible为true或者false进行显示,那么Loader的强大之处到底在哪里呢?
带着这个问题,浏览了一些资料和代码,最终发现了Loader的一个强大之处–可以对整个组件或者qml进行整体的动态切换,写起来比较简单明了。发现这个功能后,本人就动手用Loader去实现动态切换。
关于Loader的基本参数,大家可以通过在qml代码中选中Loader,按F1键查看官方的帮助文档,这里就不多介绍了。
简单介绍一个Loader 加载组件的两种方法:
1.1、加载qml文件
Loader {
id:loader
}
loader.source = "MaskWin.qml"
1.2 加载component
Loader {
id: loader
}
// 创建一个component
Component {
id:testComponent
...
}
loader.sourceComponent = testComponent;
实现功能:点击按钮,窗口动态的出现和消失。
1、做一个按钮,用来触发窗口切换
2、创建一个掩码窗口,最终生成一个qml文件
3、创建一个Loader, Loader中添加两种动画,一个是进入,一个是出去。
4、Loader指定qml,触发动画。
LoaderSturdy.qml
import QtQuick 2.0 import QtQml 2.12 import QtQuick.Window 2.12 Window { id: rootWin width: 1000 height: 1000 color: "blue" visible: false // 创建一个背景为绿色的窗口 Rectangle { id: background anchors.fill:parent color: "green" } // 创建一个loader对象,包含了两种动画,一个是进入,一个退出 Loader { id: loader NumberAnimation { id: showMask target: loader.item // 动画指定的对象是一个loader的item property: "x" duration: 1000 from: -rootWin.width to: 0 easing.type: Easing.InExpo } NumberAnimation { id: hideMask target: loader.item property: "x" duration: 1000 from: 0 to: rootWin.width easing.type: Easing.InExpo } } // 显示的时候加载qml,并且设置进入动画为true function show() { rootWin.visible = true; loader.source = "MaskWin.qml" showMask.running = true } // 退出的时候,将退出动画设置为true function hide() { hideMask.running = true; } }
Btn.qml
import QtQuick 2.12 Rectangle { property bool repeatFlag: false property color textColor: Qt.darker("#56A420", 1) property color backgroundColor: "#004597" radius: 10 color: backgroundColor Text { id: label anchors.centerIn: parent font.pixelSize: 30 color: textColor text: !repeatFlag ? "Show" :"Hide" font.bold: true } }
main.qml
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQml 2.12 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") MaskWin { id:maskWindow anchors.fill: parent visible: false; } Btn { id: loadBtn anchors.top: parent.top anchors.topMargin: 30 anchors.left: parent.left anchors.leftMargin: 30 width: 100 height: 100 radius: 10 MouseArea { anchors.fill: parent onClicked: { loadBtn.repeatFlag = !loadBtn.repeatFlag if (loadBtn.repeatFlag) { loaderS.show(); } else { loaderS.hide(); } } } } LoaderSturdy { id: loaderS } }
MaskWin.qml
import QtQuick 2.12 import QtQuick.Window 2.12 Rectangle { id:maskWin color: Qt.rgba(0.2,0.2,0.2,0.8) width: 1000 height: 1000 z: 100 MouseArea { anchors.fill: parent } Rectangle { id:showWin visible: true width: parent.width/2 height: parent.height/2 x: (parent.width - width)/2 y: (parent.height - height)/2 color: "white" radius: 10 } Rectangle { id:exitIcon anchors.right: showWin.right anchors.bottom: showWin.top anchors.bottomMargin: 20 width: 40 height: 40 radius: width/2 border.color: "white" border.width: 1 color: "transparent" Text { id: cancel text: qsTr("X") anchors.fill: parent horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 30 color: "white" } MouseArea { anchors.fill: parent onClicked: { maskWin.visible = false; } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。