Accès rapide :
QtQuick, QML : de quoi parle-t-on ?
Démarrage du moteur QtQuick
Définition de la fenêtre via le langage QML
Utilisation de la classe Window
Utilisation de la classe ApplicationWindow
Pour rappel, la librairie Qt propose deux approches disctinctes pour la mise en oeuvre d'interfaces graphiques.
L'approche traditionnelle orientée Widget : si vous avez suivis les chapitres précédents de ce cours, cette approche n'a plus aucun secret pour vous.
L'approche QtQuick/QML : elle est basée sur une approche déclarative plutôt que de tout gérer directement par programmation. Dans une certaine mesure, elle est proche des techniques de développement Web avec les langages HTML, CSS et JavaScript.
QtQuick correspond l'API (Application Programming Interface) Qt utilisée pour la mise en oeuvre d'interface graphique via cette approche.
QtQuick est donc constitué d'un certain nombre de classes sur lesquelles nous allons nous appuyer. Ces classes sont, bien entendu, différentes de celle que
nous avons déjà étudiées dans la partie précédente. A titre d'exemple, QPushButton correspond à la classe utilisée pour représenter un simple bouton.
Avec QtQuick, il faudra utiliser la classe Button. Elle est localisée dans le paquetage QtQuick.Controls.
Pour définir la structure de votre fenêtre, vous allez utiliser un formalisme déclaratif : le fameux QML (Qt Modeling Language). Le moteur QtQuick analysera le fichier QML et procedera à l'initalisation et à la configuration des objets qui y sont contenus.
Il faut savoir que le moteur QtQuick embarque le moteur Web Chromium (le projet au coeur du navigateur Chrome de la société Google). Chromium est un projet « Open Source » qui est développé par « The Chromium Project ». Vous pouvez consulter le site http://www.chromium.org/Home pour de plus amples informations. Ce que cela implique pour nous développeurs QtQuick/QML, c'est que bon nombre d'API Web sont aussi accessible en QML. Et notament les APIs « Canvas », les « WebWorkers » (appelés « WorkerScripts » en QtQuick/QML), XmlHttpRequest, ... Nous reviendrons plus tard sur ces aspects.
Pour démarrer le moteur QtQuick, nous allons nous baser sur l'API du même nom. C'est ce code qui aura la responsabilité de charger le fichier QML. Voici un exemple de code Python permettant le démarrage du moteur (engine en anglais).
1 2 3 4 5 6 7 8 9 10 11 |
import sys from PySide6.QtQml import QQmlApplicationEngine from PySide6.QtGui import QGuiApplication, QIcon if __name__ == "__main__": app = QGuiApplication(sys.argv) app.setWindowIcon(QIcon("icon.png")) engine = QQmlApplicationEngine() engine.load("Hello.qml") sys.exit(app.exec()) |
Deux classes permettent de démarrer une fenêtre QtQuick : les classes Window et ApplicationWindow.
Mais qu'elles sont les différences entre ces deux classes.
La classe Window est la plus simple des deux : en fait, ApplicationWindow dérive de Window.
Elle correspond à un conteneur dans lequel vous pourrez injecter vos composants graphiques (les fameux contrôles).
Voici un exemple simpliste de fenêtre contenant un bouton placé en son centre.
import QtQuick
import QtQuick.Controls
Window {
width: 640
height: 480
visible: true
title: "A simple button in the window"
Button {
text: "Push me"
anchors.centerIn: parent
width: 200
}
}
Et voici le résultat produit par cet exemple QML.
Comme nous l'avons déjà préciser plus haut, la type ApplicationWindow dérive du type Window.
Mais il rajoute le support des barre de contrôles (barre de menu, barres d'outils et la barre de status de votre application).
L'exemple ci-dessous vous montre comment ajouter une barre de menu et une barre de status à votre fenêtre.
import QtQuick
import QtQuick.Window
import QtQuick.Controls
import QtQuick.Layouts
ApplicationWindow {
id: window
width: 600
height: 300
visible: true
title: qsTr("QtQuick ApplicationWindow demonstration")
menuBar: MenuBar {
Menu {
title: qsTr("&File")
Action { text: "&New..." }
MenuSeparator { }
Action { text: qsTr("&Open...") }
Action { text: qsTr("&Save") }
Action { text: qsTr("Save &As...") }
MenuSeparator { }
Action { text: qsTr("&Quit") }
}
Menu {
title: qsTr("&Edit")
Action { text: qsTr("&Undo") }
Action { text: qsTr("&Redo") }
MenuSeparator { }
Action { text: qsTr("Cu&t") }
Action { text: qsTr("&Copy") }
Action { text: qsTr("&Paste") }
}
Menu {
title: qsTr("&Help")
Action { text: qsTr("&About") }
}
}
ToolBar {
width: parent.width
height: 40
RowLayout {
anchors.fill: parent
spacing: 2
ToolButton { icon.source: "../icons/previous.png" }
ToolButton { icon.source: "../icons/next.png" }
TextInput { Layout.fillWidth: true; text: "https://koor.fr" }
ToolButton { text: "Go" }
}
}
footer: Label {
padding: 10
text: "Status bar"
background: Rectangle{
color: "lightgray"
width: parent.width
height: parent.height
}
}
}
Et voici le résultat produit par cet exemple QML.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :