web-dev-qa-db-fra.com

Quelle est la différence entre QQmlApplicationEngine et QQuickView?

J'utilise QQmlApplicationEngine comme suit:

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

app.exec();

Mais maintenant, je veux activer le multi-échantillonnage pour mon application, et QQmlApplicationEngine ne semble pas avoir de méthode setFormat pour activer le multi-échantillonnage.

J'ai trouvé un moyen de le faire avec un QQmlApplicationEnginedans un forum :

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

Mais il repose sur le premier objet racine du moteur étant un QQuickWindow, ce qui n'est pas documenté dans les documents Qt. Je ne veux donc pas utiliser cette technique.

Une autre façon serait de sauter QQmlApplicationEngine et de créer un QQuickView à la place. Cela a une méthode setFormat me permettant d'activer le multi-échantillonnage, mais je me demande, est-ce que je perds quelque chose en passant de QQmlApplicationEngine à QQuickView?

En d'autres termes, quelles sont les différences entre ces deux classes?

Une différence que j'ai trouvée est la suivante (de ici ):

Contrairement à QQuickView, QQmlApplicationEngine ne crée pas automatiquement une fenêtre racine. Si vous utilisez des éléments visuels de Qt Quick, vous devrez les placer à l'intérieur d'une fenêtre.

Cette différence particulière n'a pas d'importance pour moi.

D'autres différences?

22
Stefan Monov

Titre: QQmlApplicationEngine est plus récent et plus puissant que QQuickView.

QQmlApplicationEngine expose certaines fonctionnalités de l'application centrale à QML, que l'application QQuickView contrôlerait normalement à partir de C++:

  • Connexion de Qt.quit () à QCoreApplication :: quit ()
  • Charge automatiquement les fichiers de traduction à partir d'un répertoire i18n adjacent au fichier QML principal.
  • Définit automatiquement un contrôleur d'incubation si la scène contient un QQuickWindow.
  • Définit automatiquement un QQmlFileSelector comme intercepteur d'URL, en appliquant des sélecteurs de fichiers à tous les fichiers et ressources QML.

Réf: Qt docs

Au moment où QQmlApplicationEngine a été introduit, le Qt Blog avait ceci à dire :

Dans Qt 5.0, nous avons généralement créé des applications Qt Quick en déclarant un QQuickView en C++ et en définissant l'URL de base sur celui-ci. L'inconvénient de cette approche est que vous devez utiliser C++ pour définir des propriétés telles que la largeur, la hauteur, etc. Dans Qt 5.1, nous encourageons l'utilisation de Window ou ApplicationWindow comme élément racine de votre application, donnant un contrôle complet à Qt Quick, nous introduisons donc maintenant QQmlApplicationEngine pour rendre ce cas d'utilisation un peu plus simple. Le QmlApplicationEngine est tout ce dont vous avez besoin pour configurer votre fenêtre rapide qt, récupérer les bons fichiers de traduction et il connecte implicitement le signal de l'application quit () à votre fenêtre racine.

Qt Quick Controls 2.0 est capable d'utiliser ce contrôle d'application supplémentaire, via le nouvel élément ApplicationWindow , qui:

  • est similaire à QQuickWindow normal, mais ajoute la prise en charge de la définition d'une barre de menu, d'une barre d'outils et d'une barre d'état spécifiques à une fenêtre dans QML.
  • facilite l'ajout d'un élément d'en-tête et de pied de page à la fenêtre.
  • permet de contrôler les propriétés, l'apparence et la disposition de la fenêtre à partir de QML.
  • prend en charge les popups via sa propriété overlay, qui garantit que les popups sont affichés au-dessus des autres contenus et que l'arrière-plan est grisé lorsqu'une popup modale est visible.

Donc, pour utiliser certaines des fonctionnalités de Qt Quick Controls comme MenuBar et Popup, nous devons:

  • utilisez ApplicationWindow comme élément QML de premier niveau au lieu de Rectangle ou Item
  • utilisez le nouveau QQmlApplicationEngine pour charger le QML à partir de C++ au lieu de l'ancien QQuickView.
21
Mark Ch

Vous pouvez utiliser les deux ensemble si vous ne voulez pas que votre élément de niveau supérieur soit un Window.

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