30

我使用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)

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

另一种方法是跳过QQmlApplicationEngine并创建一个QQuickView。这确实有一种setFormat方法可以让我启用多重采样,但我想知道,切换QQmlApplicationEngine到是否会丢失任何东西QQuickView

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

我发现的一个区别是(从这里):

与 QQuickView 不同,QQmlApplicationEngine 不会自动创建根窗口。如果您使用 Qt Quick 中的可视项目,则需要将它们放置在 Window 内。

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

还有其他区别吗?

4

2 回答 2

31

标题:QQmlApplicationEngine 比 QQuickView 更新更强大。

QQmlApplicationEngine 向 QML 公开了一些中央应用程序功能,QQuickView 应用程序通常可以从 C++ 控制这些功能:

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

参考:Qt 文档

在引入 QQmlApplicationEngine 的时候,Qt 博客有这样的说法

在 Qt 5.0 中,我们通常通过在 C++ 中声明 QQuickView 并在其上设置基本 URL 来创建 Qt Quick 应用程序。这种方法的缺点是您必须使用 C++ 来设置宽度、高度等属性。在 Qt 5.1 中,我们鼓励使用 Window 或 ApplicationWindow 作为应用程序的根项,从而完全控制 Qt Quick,因此我们现在介绍QQmlApplicationEngine 使这个用例更简单一些。QmlApplicationEngine 是您设置 qt 快速窗口、选择正确的翻译文件所需的全部,它隐式地将应用程序 quit() 信号连接到您的根窗口。

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

  • 类似于常规的 QQuickWindow,但增加了对在 QML 中设置窗口特定的 MenuBar、ToolBar 和 StatusBar 的支持。
  • 可以方便地向窗口添加页眉和页脚项目。
  • 可以从 QML 控制窗口的属性、外观和布局。
  • 通过其覆盖属性支持弹出窗口,这确保弹出窗口显示在其他内容之上,并且当模式弹出窗口可见时背景变暗。

所以,为了使用一些 Qt Quick Controls 的特性,比如 MenuBar 和 Popup,我们需要:

  • 使用 ApplicationWindow 作为我们的顶级 QML 项目,而不是 Rectangle 或 Item
  • 使用新的 QQmlApplicationEngine 从 C++ 加载 QML,而不是旧的 QQuickView。
于 2016-10-26T20:24:02.247 回答
9

如果您不希望顶级项目成为Window.

QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();
于 2016-10-22T16:09:15.337 回答