QQmlApplicationEngine和QQuickView的区别是什么?



我使用QQmlApplicationEngine如下:

QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
app.exec();

但是现在我想为我的应用程序启用多采样,QQmlApplicationEngine似乎没有setFormat方法来启用多采样。

我在论坛上找到了一种使用QQmlApplicationEngine的方法:

QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)

但是它依赖于引擎的第一个根对象是QQuickWindow,这在Qt文档中没有记录。所以我不想使用这种技术。

另一种方法是跳过QQmlApplicationEngine并创建QQuickView。这确实有一个setFormat方法让我启用多采样,但我想知道,我从QQmlApplicationEngine切换到QQuickView失去了什么?

换句话说,这两个类之间有什么区别?

我发现一个不同之处是:

不像QQuickView, QQmlApplicationEngine不自动创建根窗口。如果你正在使用Qt Quick中的可视化项目,你需要将它们放在窗口内。

这种特殊的差异对我来说并不重要。

还有其他区别吗?

标题:QQmlApplicationEngine比QQuickView更新更强大

QQmlApplicationEngine向QML公开了一些中心应用程序功能,QQuickView应用程序通常会从c++控制这些功能:

  • 连接Qt.quit()到QCoreApplication::quit()
  • 自动从主QML文件旁边的i18n目录加载翻译文件。
  • 如果场景包含QQuickWindow,则自动设置孵化控制器。
  • 自动设置一个QQmlFileSelector作为url拦截器,将文件选择器应用于所有QML文件和资源。

Ref: Qt docs

当QQmlApplicationEngine被引入的时候,Qt Blog是这样说的:

在Qt 5.0中,我们通常通过声明a来创建Qt Quick应用程序QQuickView在c++和设置的基础url。缺点是方法是你必须使用c++来设置属性,比如宽度,高度等。在Qt 5.1中,我们鼓励使用Window或ApplicationWindow作为你的应用程序的根项目,给予Qt完全的控制快,所以我们现在介绍QQmlApplicationEngine来制作这个用例稍微简单一点。QmlApplicationEngine就是全部你需要设置qt快速窗口,选择正确的翻译它隐式地将应用程序quit()信号连接到您的根窗口。

Qt快速控件2.0能够利用这个额外的应用程序控件,通过新的项目ApplicationWindow,它:

  • 类似于常规的QQuickWindow,但增加了在QML中设置窗口特定的菜单栏、工具栏和状态栏的支持。
  • 可以方便地为窗口添加页眉和页脚。
  • 使得从QML中控制窗口的属性、外观和布局成为可能。
  • 通过其overlay属性支持弹出窗口,该属性确保弹出窗口显示在其他内容之上,并且当模态弹出窗口可见时背景变暗。

因此,为了使用一些Qt快速控制功能,如菜单栏和弹出窗口,我们需要:

  • 使用ApplicationWindow作为顶层QML项,而不是Rectangle或item
  • 使用新的QQmlApplicationEngine从c++加载QML,而不是旧的QQuickView。

如果你不希望你的顶级项目是Window,你可以同时使用。

QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();

相关内容

  • 没有找到相关文章

最新更新