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