龙空技术网

Qt加载qml的方式

QT教程 274

前言:

而今大家对“qt加载界面”可能比较关怀,兄弟们都需要剖析一些“qt加载界面”的相关文章。那么小编同时在网络上搜集了一些关于“qt加载界面””的相关资讯,希望姐妹们能喜欢,我们快快来了解一下吧!

1、QQmlApplicationEngined搭配 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();}

这种方式是加载以 Window为跟对象的 QML 文件,QML 拥有窗口的完整控制权,可以直接设置标题、窗口尺寸等属性。

2、QQuickView 搭配 Item

示例:

#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();}

使用 QQuickView 显示 QML 文件,对窗口的控制权(标题、窗口尺寸)是在 C++代码中,QML 文件是以 Item (及 以Item为根的组件)作为根对象。

3、QQuickWidget 加载 QML【Item】

示例:

QQuickWidget *view = new QQuickWidget;view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));view->show();

QQuickWidget是继承于 QWidget 控件,这种方式主要是用于在 QWidget 界面上加载 QML 界面。

PS:

所以只有第一种是对窗口有绝对的控制权;

后面两种的区别:

①、QQuickWidget的继承自QWidget,可以直接添加到Qt布局中;

②、QQuickView继承自QQuickWindow(继承自QWindow),通过转换才能添加到Qt布局中:

【粉丝福利】Qt开发学习资料包、大厂面试题、项目视频、学习路线,包括(Qt C++基础,数据库编程,Qt项目实战、Qt框架、QML、Opencv、qt线程等等)有需要的可以进企鹅裙937552610领取哦~

QQuickView *view = new QQuickView();QWidget *widget = QWidget::createWindowContainer(view, this);view->setSource(QUrl("qrc:/main.qml"));

③、QQuickWidget因涉及渲染到render到OpenGL帧缓冲区对象,会带来性能损失,导致较QQuickView性能稍低;

④、QQuickWidget将禁用所有平台上的线程render loop,例如Animator类和vsync驱动的动画不能使用;

⑤、避免在QQuickWidget上调用winId(),这个函数会触发本机窗口的创建,导致性能降低,并可能出现渲染问题;

故:

如主体项目为QWidget,QML只作为辅助,如完成一下显示小动画之类,那么请选择QQuickWidget,可以更方便得与已有项目中的QWidget结合;

如项目为全新,不涉及到QWidget的历史包袱,那么果断选择性能更好的QQuickView

4、QQmlEngine + QQmlComponent

#include <QApplication>#include <QQmlEngine>#include <QQmlComponent>#include <QQuickWindow>#include <QDebug>int main(int argc, char *argv[]){    QApplication app(argc, argv);    QQmlEngine engine;    QQmlComponent *component = new QQmlComponent(&engine);    QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit()));    component->loadUrl(QUrl("qrc:/main.qml"));    if (!component->isReady() ) {        qWarning("%s", qPrintable(component->errorString()));        return -1;    }    QObject *topLevel = component->create();    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);    QSurfaceFormat surfaceFormat = window->requestedFormat();    window->setFormat(surfaceFormat);    window->show();    return app.exec();}

标签: #qt加载界面