• 在Qt Quick中一个简单Hello World加载过程


    Qt5基本类图:

     


    QQmlEngine
        QQmlEngine类提供了一个QML引擎,用于管理由QML文档定义的对象层次架构,QML提供了一个默认的QML上下文(根上下文,获取函数QQmlEngine::rootContext())。该上下文是QML表达式的执行环境,并且保证在使用时对象属性能够被正确更新。
        QQmlEngine可以将全局设置应用到其管理下的所有QML对象,比如网络通信:QNetworkAccessManager、全局永久(整个程序生命周期)存储的文件路径(资源预加载)等

    QQmlContext
        QQmlContext提供了对象实例化和表达式执行所需要的上下文环境。所有的QML对象都要在特定的上下文中实例化,所有的表达式都要在特定的上下文中执行。上下文以根上下文为主组成层次结构,子上下文继承父上下文的属性,修改子上下文的属性值可以覆盖父上下文的属性值。
        QQmlContext::setContextProperty()能够通过名字将数据显示绑定到上下文,定义、更新上下文的属性
    【注意】使用QQmlContext::setContextProperty()显示设置对象的属性会优先于上下文对象的属性

    QQmlComponent
        QML文档定义的对象类型可以在运行时使用QQmlComponent类进行实例化,QQmlComponent封装了QML组件(component)的定义,可以用于加载QML文档,前提条件是需要QQmlEngine实例化QML文档中定义的对象层次结构。
        QQmlComponent实例既可以使用C++直接创建,也可以通过Qt.createComponent()函数在QML代码中创建

    QQmlExpression
        动态执行表达式QQmlExpression允许客户端,在C++中利用一个特定的QML上下文执行JavaScript表达式,表达式执行的结果以QVariant的形式返回,并且遵守QML引擎确定的转换规则。


    加载过程
    每一个,Qt Quick函数都必须要有唯一 一个QQmlEngine引擎用于加载QML文件,唯一 一个QQmlContext用于QML对象实例化和表达式执行的上下文环境,一个QQmlComponent组件用于实例化第一个QML对象。一般QML加载方式有两种。

    1、QGuiApplication + QQmlApplicationEngine + Window
    我们在Qt Creator新建一个Qt Quick的hello world工程都是默认使用这种方式加载的。由上图的继承关系可以看出,
    QGuiApplication:会调用父类的轮询函数 [static] int QCoreApplication::exec(),让Qt函数一直在跑在主线程轮询
    QQmlApplicationEngine:使用父类的QQmlEngine引擎用于加载QML文件
    Window:这是QML中主节点,对于的C++类是QQuickWindow,是一个可视化的QML对象
    ******************************* main.cpp **************************************
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    intmain(intargc,char*argv[])
    {
    QGuiApplication app(argc,argv);
    QQmlApplicationEngine engine; //QML引擎对象
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); //使用引擎直接加载QML对象进行实例化
    returnapp.exec(); //qt轮询函数,在主线程轮询
    }
    ******************************* main.qml **************************************
    importQtQuick2.3
    importQtQuick.Window2.2
    Window{ //可视化的QML对象
    visible:true
    Text{
    text:qsTr("HelloWorld")
    anchors.centerIn:parent
    }
    }
    此方法还有一种经常使用的写法:
    QQmlEngine engine;                                                                                 //QML引擎
    QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));       //使用QQmlComponent加载QML对象
    QObject* object = component.create();                   //用QQmlComponent创建一个组件的实例化,并且赋值给object*,这步操作非常关键,Object类型可以转换其他任意类型,比如QQuickItem
    object->setProperty("width", 500);                                                           //元对象系统赋值操作
    QQmlProperty(object, "width").write(500);                                              //元对象系统赋值操作
    QQuickItem* item = qobject_cast<QQuickItem*>(object);                    //把 QObject* 转换成 QQuickItem* 类型
    tiem->setWidth(500);                                                                               //QQuickItem* 赋值操作

    2、QGuiApplication + QQuickView + Item
    QGuiApplication:会调用父类的轮询函数 [static] int QCoreApplication::exec(),让Qt函数一直在跑在主线程轮询
    QQuickView:使用父类的显示函数进行显示[slot] void QWindow::show()
    Item:这是QML中主节点,对于的C++类是QQuickItem,是一个不可视的QML对象,所以依赖C++的显示
    例子:
    ******************************* main.cpp **************************************
    #include <QGuiApplication>
    #include<QQuickView>
    #include<QQuickItem>
    intmain(intargc,char*argv[])
    {
    QGuiApplication app(argc,argv);
    QQuickView view;                                                                       //QQuickView对象
    view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));       //加载QML
    view.show();                                                                                //QQuickView可以显示可视化QML对象
    QQuickItem* item = view.rootObject();                                    //返回当前QQuickView的根节点
    tiem->setWidth(500);                                                                //QQuickItem* 赋值操作
    returnapp.exec(); //qt轮询函数,在主线程轮询
    }
    ---------------------
    作者:西_瓜_瓜
    来源:CSDN
    原文:https://blog.csdn.net/xi_gua_gua/article/details/62238497
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Java8 中的 Optional
    阿里云查看本服务器 公网ip地址 命令
    Linux添加alias简化命令
    kafka consumer 配置详解
    Kafka查看topic、consumer group状态命令
    ConcurrentHashMap源码分析
    HashMap源码分析
    Java使用Aspose组件进行多文档间的转换操作
    个人Vim配置(即vim目录下vimrc_)
    暑假个人小结
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/10133514.html
Copyright © 2020-2023  润新知