QQuickWidget与QQuickView的区别:
- QQuickWidget的继承自QWidget,可以直接添加到Qt布局中;
- QQuickView继承自QQuickWindow(继承自QWindow),通过转换才能添加到Qt布局中,代码如下
QQuickView *view = new QQuickView();
QWidget *widget = QWidget::createWindowContainer(view, this);
view->setSource(QUrl("qrc:/main.qml"));
QQuickWidget使用注意
- QQuickWidget因涉及渲染到render到OpenGL帧缓冲区对象,会带来性能损失,导致较QQuickView性能稍低;
- QQuickWidget将禁用所有平台上的线程render loop,例如Animator类和vsync驱动的动画不能使用;
- 避免在QQuickWidget上调用winId(),这个函数会触发本机窗口的创建,导致性能降低,并可能出现渲染问题;
适用情况
- 如主体项目为QWidget,QML只作为辅助,如完成一下显示小动画之类,那么请选择QQuickWidget,可以更方便得与已有项目中的QWidget结合;
- 如项目为全新,不涉及到QWidget的历史包袱,那么果断选择性能更好的QQuickView;
qml加载实例
// QQuickView - qml顶层不可为Window
QQuickView *view = new QQuickView();
view->setResizeMode(QQuickView::SizeRootObjectToView);
view->setSource(QUrl("qrc:/main.qml"));
// 以QWidget形式显示
QWidget *widget = QWidget::createWindowContainer(view, this);
widget->show();
// 以窗口形式直接显示
view.show ();
// QQuickWidget - qml顶层不可为Window
QQuickWidget *quickWidget = new QQuickWidget();
quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
quickWidget->setSource(QUrl("qrc:/main.qml"));
// QQmlApplicationEngine加载QML - qml顶层为Window
// 以Window为根对象的QML文件,这时QML就完全拥有了控制权,可以直接设置窗体的标题、尺寸等信息
QQmlApplicationEngine *engine = new QQmlApplicationEngine();
engine->load(QUrl(QStringLiteral("qrc:/main.qml")));
QML学习资料
- qml book in english: https://qmlbook.github.io/assets/qt5_cadaques.pdf
- qml book in chinese: https://github.com/cwc1987/QmlBook-In-Chinese
- 在线qml练习: https://qmlonline.kde.org/