QT之自定义组件和动态加载

自定义组件

在qml文件中自定义组件可以分为全局自定义组件和内嵌自定义组件

全局自定义组件定义在一个单独的qml文件中,文件名即组件名(这点是c++程序员开始比较迷惑的地方,实际上java的文件名和类名也是如此),首字母默认会转化为大写,类似Item、Text等。

下面自定义一个组件,每秒会自己变幻背景色,我们称之为闪光灯FlashLight,保存为FlashLight.qml

import QtQuick 2.7
import QtQuick.Controls 2.0

Rectangle {
    id: flash;

    property int time : 1000;
    radius: 10
    width: 20
    height: 20

    Timer {
        id: timer;
        interval: time;
        repeat: true;
        running: true;
        triggeredOnStart: true;
        onTriggered: {
            flash.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1);
        }
    }

    onTimeChanged: {
        timer.interval = time;
    }

    onRadiusChanged: {
        width = radius*2;
        height = radius*2;
    }
}

上述就是一个自定义组件,单独定义在一个qml文件中,它有一个顶层元素是Rectangle,相当于继承自Rectangle,所以也拥有了Rectangle的所有属性和方法,在另外的qml文件中调用它很简单,通过其文件名即可,如下所示

import QtQuick 2.7
import QtQuick.Controls 2.0

Rectangle {
    width: 640;
    height: 480;
    color: "#DCDCDC"

    FlashLight {
        anchors.centerIn: parent
        radius: 100;
        time: 100;
    }
}

直接使用FlashLight ,就和使用Rectangle一样,这里设定了它的属性半径是100,时间是100ms变幻一次颜色,time是我们自定义的一个属性,自定义属性的格式是property type name: value

内嵌组件相当于内嵌类的概念,只有当前文件作用域能够使用它,一般声明形式如下:

import QtQuick 2.7
import QtQuick.Controls 2.0

Rectangle {
    width: 100;
    height: 100;
    color: "#FFF8DC";
    radius: 10;

    border.width: 10;
    border.color: "#FAEBD7";

    Component {
        id: circle;
        Rectangle {
            width: 20;
            height: 20;
            radius: 10;
            color: "#FF0000"
        }
    }

    Loader {
        id: one;
        sourceComponent: circle;
        anchors.centerIn: parent;
        visible: true;
    }

    Loader {
        id: two;
        sourceComponent: circle;
        anchors.centerIn: parent;
        visible: false;
    }

    Loader {
        id: three;
        sourceComponent: circle;
        anchors.centerIn: parent;
        visible: false;
    }

    Loader {
        id: four;
        sourceComponent: circle;
        anchors.centerIn: parent;
        visible: false;
    }

    Loader {
        id: five;
        sourceComponent: circle;
        anchors.centerIn: parent;
        visible: false;
    }

    Loader {
        id: six;
        sourceComponent: circle;
        anchors.centerIn: parent;
        visible: false;
    }

    property int num: 1
    onNumChanged: {
        one.visible = false;
        two.visible = false;
        three.visible = false;
        four.visible = false;
        five.visible = false;
        six.visible = false;
        switch(num){
        case 1:
            one.visible = true;
            break;
        case 2:
            two.visible = true;
            break;
        case 3:
            three.visible = true;
            break;
        case 4:
            four.visible = true;
            break;
        case 5:
            five.visible = true;
            break;
        case 6:
            six.visible = true;
            break;
        }
    }
}

其中id为circle的就是一个内嵌组件,内嵌组件以Component进行定义,给定一个id,Loader是以动态加载的方式在使用它,使用sourceComponent来指定id

自定义属性

property type name: value

自定义信号

sigal name([type arg1,type arg2,...])

动态创建

除了上述以文件名创建组件和以Loader通过id或者文件路径加载组件外,QT还提供了两个JS方法来创建组件

1、使用 Qt.createComponent() 动态地创建一个组件对象,然后使用 Component 的 createObject() 方法创建对象
2、使用 Qt.createQmlObject() 从一个 QML 字符串直接创建一个对象

关于这两种方法的参数和使用可以查阅帮助手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithewei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值