项目描述:
随着对qt的不断了解,使用qml的场景逐渐变多。但是又没有直接过渡到使用qquick开发软件,所以加载qml文件的问题显得很有必要。qml 文件该加载到工程中有以下几种方式:
1. QQmlApplicationEngined搭配 Window
QML 文件以 Window为根对象 ,拥有窗口的完整控制权,可以直接设置标题、窗口尺寸等属性。
示例:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
2. QQuickView 搭配 Item
QML 文件是以 Item (及 以Item为根的组件)作为根对象,对窗口的控制权(标题、窗口尺寸)是在 C++代码中,
示例:
#include <QGuiApplication>
#include <QQuickView>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQuickView *view = new QQuickView;
view->setResizeMode(QQuickView::SizeRootObjectToView);
view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
view->show();
return app.exec();
}
3. QQuickWidget(继承于 QWidget) 加载 QML
这种方式主要是用于在 QWidget 界面上加载 QML 界面。
示例:
QQuickWidget *view = new QQuickWidget;
view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
view->show();
缺点:
QQuickWidget是为了在QWidget和QQuick进行过渡设计的,相对于QQuickView他有以下缺点:
- QQuickWidget的灵活,是以牺牲性能为代价的。与QQuickWindow和QQuickView不同,QQuickWidget涉及渲染到render到OOpenGL帧缓冲区对象,这个会带来轻微的性能损失。
- QQuickWidget将禁用所有平台上的线程render loop,例如Animator类和vsync驱动的动画不能使用
- 避免在QQuickWidget上调用winId()。这个函数会触发本机窗口的创建,导致性能降低,并可能出现渲染问题。