Component复用对象原理(qml)

简介: 简介     Component是Qt封装好的、只暴露必要接口的QML类型,可以重复利用。一个QML组件就像一个黑盒子,它通过属性、信号、函数和外部世界交互。   一个Component既可以定义在独立的QML文件(.qml为后缀的文件)中,也可以嵌入到其他的QML文件中来定义。

简介  

  Component是Qt封装好的、只暴露必要接口的QML类型,可以重复利用。一个QML组件就像一个黑盒子,它通过属性、信号、函数和外部世界交互。

  一个Component既可以定义在独立的QML文件(.qml为后缀的文件)中,也可以嵌入到其他的QML文件中来定义。那么这两种方式分别适用于什么场景呢?这里有一个原则可以帮助我们去选择Component的定义方式:如果一个Component比较小且只在某个QML文件中使用,或者说一个Component从逻辑上来看属于某个QML文档,那么就可以采用嵌入的方式来定义该Component;如果这个Component有很多地方可以用到,也就是说复用率比较高,那么就可以采用定义在独立的QML文件中的方式。下面说明一下这两种实现Component方式的差别:

  • 嵌入式定义Component:

   要在一个QML文件中嵌入Component的定义,需要使用Component对象。

  定义一个Component与定义一个QML文件类似,Component只能包含一个顶层Item,而且在这个Item之外不能定义任何数据,除了id。 在顶层Item之内,则可以包含更多的子元素来协同工作,最终形成一个具有特定功能的组件。

  Component通常用来给一个View提供图形化组件,比如ListVIew::delegate属性就需要一个Component来指定如何显示列表的每一个项,又比如ButtonStyle::background属性也需要一个Component来指定如何绘制Button的背景。  

  Component不是Item的派生类,而是从QQmlComponent继承而来的,虽然它通过自己的顶层Item为其他的view提供可视化组件,但它本身是不可见元素。你可以这么理解:你定义的组件是一个新的类型,他必须被实例化以后才能显示。而要实例化一个嵌入在QML文件中定义的Component,则可以通过Loader。

  • 在单独文件中定义Component:

  很多时候我们把一个Component单独定义在一个QML文件中,比如Qt Qucik提供的BusyIndicator空间,其实就是在BusyIndicator中定义一个组件(BusyIndicator.qml):


Control {

    id: indicator


    /*! \qmlproperty bool BusyIndicator::running


    This property holds whether the busy indicator is currently indicating

    activity.


    \note The indicator is only visible when this property is set to \c true.


    The default value is \c true.

    */

    property bool running: true


    Accessible.role: Accessible.Indicator

    Accessible.name: "busy"


    style: Settings.styleComponent(Settings.style, "BusyIndicatorStyle.qml", indicator)

}



  可以看到BusyIndicator的代码非常简单,只是给Control元素(Qt Quick定义的私有元素,用作其他控件的基类,如ComboBox、BusyIndicator等)增加了一个属性,设置了几个值而已。

  BusyIndicator.qml文件中的顶层Item是Control,而我们使用时却是以BusyIndicator为组件名(类名)。这是定义Component的一个约定:组件名必须和QML文件名一致,且组件名的首字母必须是大写的。Qt Quick提供的多数基本元素和特性,都可以在定义组件时使用 。

  例子:在一个单独的QMl文件中定义颜色选择组件ColorPicker,对应QML文件为ColorPicker.qml,可以在其他的QMl文件中使用Cololr{...}来创建ColorPicker的实例。


import QtQuick 2.6

Rectangle {
    id: colorPicker
    width: 50
    height: 30
    signal colorPicked(color clr);

    function configureBorder() {
        colorPicker.border.width = colorPicker.focus ? 2 : 0;
        colorPicker.border.color = colorPicker.focus ? "#90D750" : "#808080";
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            colorPicker.colorPicked(colorPicker.color);
            mouse.accepted = true;
            colorPicker.focus = true;
        }
    }

    Keys.onReturnPressed: {  // 对应Enter键
        console.log("ColorPicker:onReturnPressed");
        colorPicker.colorPicked(colorPicker.color);
        event.accepted = true;
    }

    Keys.onSpacePressed: {  // 对应Space键
        console.log("ColorPicker:onSpacePressed");
        colorPicker.colorPicked(colorPicker.color);
        event.accepted = true;
    }

    onFocusChanged: {
        console.log("ColorPicker:onFocusChanged");
        configureBorder();
    }

    Component.onCompleted: {
        console.log("ColorPicker:onCompleted");
        configureBorder();
    }
}



 在单独文件中定义Component,与嵌入式定义有明显的不同:Component对象不见了,是因为在单独文件中定义组件,不需要Component对象,只有在其他QML文件中嵌入式定义组件时才需要Component对象。

  main.qml内容:



 
 

部分内容来自《Qt Quick核心编程》


目录
相关文章
|
JavaScript 前端开发 C++
QML信号与信号槽实践指南:轻松掌握现代软件开发的关键技术(二)
QML信号与信号槽实践指南:轻松掌握现代软件开发的关键技术
685 0
|
消息中间件 存储 负载均衡
|
自然语言处理 安全 C++
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
9743 4
QML 界面切换的方法
QML 界面切换的方法
916 1
|
5月前
|
Ubuntu 安全 Linux
Linux发行版深度对比:Ubuntu、CentOS与Fedora
Ubuntu、CentOS和Fedora分别在用户体验、企业级稳定性和技术创新方面展现了各自的优势,适合不同类型的用户和场景。选择合适的Linux发行版应基于个人或组织的需求、技术背景以及对稳定性和最新技术的偏好。无论是追求直观易用的桌面环境,还是寻求企业级的稳定性与安全性,亦或是渴望体验最新技术的前沿,这三大发行版都提供了丰富的选项和强大的支持,满足了Linux用户在各种场景下的需求。在选择发行版时,深入理解其特点和优势,结合自身需求进行考量,将有助于做出最适合自己的决策,从而在Linux世界中获得最佳的使用体验。
|
10月前
|
人工智能 搜索推荐 数据挖掘
销售易CRM:用户体验与实际应用深度分析
销售易CRM是国内领先的客户关系管理系统,以其现代化的界面设计、强大的移动端支持和优质的客户服务著称。系统操作简洁直观,支持个性化定制和多设备访问,确保随时随地办公。移动端功能齐全,提供实时协同工具和离线支持,极大提高工作效率。销售易CRM还注重客户服务,提供快速响应、专业培训和持续优化。实际应用案例显示,该系统帮助中大型企业和成长型企业实现销售流程数字化管理,提升销售效率和客户满意度,是企业数字化转型的理想选择。
|
10月前
|
安全 开发者 Docker
Docker技术背景与应用:解决现代开发中的关键问题
Docker作为一种革命性的容器化技术,极大地改变了现代软件开发的方式。通过解决环境一致性、依赖管理、部署复杂性和资源利用率等问题,Docker为开发者提供了高效、灵活的开发和部署环境。尽管面临着一些挑战,但随着技术的发展和完善,Docker将继续在现代软件开发中发挥重要作用。作为全栈工程师,掌握并善用Docker技术,将为我们的开发工作带来更多便利和可能性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
647 0
[simulink] --- simulink辅助技巧
[simulink] --- simulink辅助技巧
631 1
|
容器
QML/Qt Quick anchors.fill 的使用(三)
QML/Qt Quick anchors.fill 的使用
306 0

热门文章

最新文章