一、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