QT QML 文件加载方式 QT 类注册QML 方式

一、QML 文件加载方式

一共三种方式加载QML 文件。

 
一, QQmlApplicationEngine+ Window

main.cpp

    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
     
        QGuiApplication app(argc, argv);
     
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
     
        return app.exec();
    }

main.qml

    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    }

此种方式以Window为根对象的QML文件,这个时候QML就完全拥有了控制权,可以直接设置窗体的标题、尺寸等信息

永久加载,存在内存中;

 
二,QQuickView +   Rectangle

main.cpp   

 int main(int argc, char *argv[])
    {
     
        QGuiApplication app(argc, argv);
     
        QQuickView view;
        view.setResizeMode (QQuickView::SizeRootObjectToView);
        view.setSource (QUrl("qrc:/main.qml"));
        view.show ();
     
        return app.exec();
    }

main.qml

    Rectangle {
        visible: true
        width: 640
        height: 480
    }

    此种方式对窗口的控制权在C++代码中要实现,QML文件是以Item作为根对象的。需要设置标题可在c++ 中调用(view.setTitle("xxxx"))
    如果Rectangle 换车Window 则会出现两个窗口。

 
三,QQuickWidget +Rectangle

main.cpp

    #include <QApplication>
    #include <QQuickWidget>
     
    int main(int argc, char *argv[])
    {
     
        QApplication app(argc, argv);
        QQuickWidget  *view = new QQuickWidget ;
        view->setSource (QUrl("qrc:/main.qml"));
        view->show ();
     
        return app.exec();
    }

main.qml

    Rectangle {
        visible: true
        width: 640
        height: 480
    }

    因为QQuickWidget 继承QWidget ,所以应该是使用QApplication
    pro 文件需要添加 QT += quickwidgets

二、C++ 类注册方式


setContextProperty qmlRegisterType qRegisterMetaTyp

1,setContextProperty

如果要使用单个全局类来访问QML或从QML访问.这里您需要在使用setContextProperty()之前创建此类对象。就是说 类实列化一次,QML中可以直接使用这个类。

如:

      MainController mainController;  
      engine.rootContext()->setContextProperty("MainController", &mainController);

则QML中可直接使用 MainController。

2,qmlRegisterType

将C++实现的类在QML中调用的。与1 不一样,全局不唯一。

如:

qmlRegisterType<AgoraWeb>("AgoraWeb",1,0,"AgoraWeb");

  每个QML中 会自己实例化一份内存。

    Item {
        id:root
        property bool isMaster: false
        AgoraWeb{
            id:agoraWeb
        }

3,qRegisterMetaType

Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册

步骤:(以自定义TextNumber类型为例)

自定一种类型,在这个类型的顶部包含:#include <QMetaType>

在类型定义完成后,加入声明:Q_DECLARE_METATYPE(TextNumber);

在main()函数中注册这种类型:qRegisterMetaType<TextNumber>("TextNumber");

如果还希望使用这种类型的引用,可同样要注册:qRegisterMetaType<TextNumber>("TextNumber&")
 

三、QCoreApplication、QGuiApplication、QApplication区别

QCoreApplication定义在core模块中,为应用程序提供了一个非gui的事件循环;

QGuiApplication定义在gui模块中,提供了额外的gui相关的设置,比如桌面设置,风格;

QApplication定义在widgets模块中,是QWidget相关的,能设置双击间隔,按键间隔,拖拽距离和时间,滚轮滚动行数等

命令行:QCoreApplication

widgets 相关:QApplication

qml:QGuiApplication
 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

恋恋西风

up up up

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

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

打赏作者

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

抵扣说明:

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

余额充值