Qt Quick Comment faire
Cette page a pour but de fournir une référence utile et facile à découvrir qui montre la manière la plus simple et la meilleure d'effectuer des tâches spécifiques dans Qt Quick. Chaque solution fournit des extraits de code QML et/ou C++ le cas échéant, et chaque extrait est automatiquement testé par Qt Test pour s'assurer qu'il reste fonctionnel.
Comment puis-je.. :
- Appeler une fonction C++ à partir de QML lorsqu'un bouton est cliqué
- Voir quel élément a le focus actif
- Créer un sélecteur de temps comme le TimePickerDialog d'Android
- Utiliser un enum C++ en JavaScript
- Créer une jauge
Appeler une fonction C++ depuis QML lorsqu'un bouton est cliqué
En supposant que le type C++ soit globalement disponible pour les fichiers QML de l'application, la manière la plus simple est d'en faire un singleton QML avec QML_SINGLETON. Par exemple, dans le fichier d'en-tête, backend.h:
#include <QObject> #include <QQmlEngine> class Backend : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON public: Q_INVOKABLE void doStuff(); };
backend.cpp:
#include "backend.h"#include <QDebug>void Backend::doStuff(){ qDebug() << "Did stuff!"; }
Vous pouvez ensuite appeler cette fonction à partir de n'importe quel fichier QML :
import QtQuick.Controls import MyModule ApplicationWindow { width: 400 height: 400 title: qsTr("C++ Button example") Button { text: qsTr("Click me") onClicked: Backend.doStuff() } }
Si le type C++ ne doit être accessible qu'à un petit nombre de fichiers QML, envisagez d'utiliser QML_ELEMENT. Pour d'autres façons d'exposer les types C++ à QML, voir Choisir la bonne méthode d'intégration entre C++ et QML.
Cet exemple suppose que le type Backend est disponible dans un module QML. Avec CMake, cela se fait via qt_add_qml_module. Pour un exemple qui démontre cela en détail, voir Construire une application QML.
Voir quel élément a le focus actif
Écrire un gestionnaire de signal de changement de propriété pour la propriété activeFocusItem de la fenêtre :
import QtQuick import QtQuick.Controls ApplicationWindow { width: 400 height: 400 visible: true title: qsTr("Active focus debugging example") onActiveFocusItemChanged: print("activeFocusItem: " + activeFocusItem) Row { TextField { objectName: "textField1" } TextField { objectName: "textField2" } } }
Cela permettra d'afficher sur la console l'élément qui a actuellement le focus actif. Pour que la sortie soit utile, donnez à chaque élément une description objectName.
Créer un sélecteur de temps comme le TimePickerDialog d'Android
Nous avons préparé un exemple composé de quelques fichiers QML qui démontrent comment procéder. Ils peuvent être utilisés dans votre application de la manière suivante :
import QtQuick import QtQuick.Layouts import QtQuick.Controls.Material ApplicationWindow { id: window width: 600 height: 600 visible: true title: qsTr("Time Picker Example") Material.theme: darkThemeSwitch.checked ? Material.Dark : Material.Light // Shows the selected time and opens the dialog. TimeComponentLabel { id: openDialogLabel width: parent.width - 80 anchors.centerIn: parent font.pixelSize: Qt.application.font.pixelSize * 8 renderTypeQuality: Text.VeryHighRenderTypeQuality interactive: !timePickerDialog.opened text: Qt.formatTime(new Date(1970, 1, 1, timePickerDialog.hours, timePickerDialog.minutes), "hh:mm") onTapped: timePickerDialog.openWithMode(TimePicker.Mode.Hours) } ColumnLayout { // We always want the openDialogLabel to be centered in the window, not us. // For that reason, we use anchors rather than putting the root items into a ColumnLayout. anchors.horizontalCenter: parent.horizontalCenter anchors.top: openDialogLabel.bottom anchors.topMargin: 24 spacing: 12 Switch { id: is24HourSwitch text: qsTr("24 Hour") checked: timePickerDialog.is24Hour } Switch { id: darkThemeSwitch text: qsTr("Dark") } } TimePickerDialog { id: timePickerDialog anchors.centerIn: parent is24Hour: is24HourSwitch.checked onTimeAccepted: print("A time was chosen - do something here!") } }
TimePickerDialog dans son thème clair. |
TimePickerDialog dans son thème sombre. |
Utiliser une énumération C++ en JavaScript
Pour exposer une énumération C++ à JavaScript (c'est-à-dire QJSEngine, et non QQmlEngine ou QQmlApplicationEngine), utilisez newQMetaObject() et registerModule() :
QJSEngine engine; engine.installExtensions(QJSEngine::AllExtensions); QJSValue metaObjects = engine.newObject(); const QJSValue backendJsMetaObject = engine.newQMetaObject(&Backend::staticMetaObject); metaObjects.setProperty("Backend", backendJsMetaObject); // Repeat the two lines above for other types as needed. engine.registerModule("MyApp", metaObjects); Backend backend(&engine); const bool loaded = backend.load();
L'énumération peut alors être utilisée en JavaScript :
export function backendStatusUpdate(backendStatus) {
if (backendStatus === Backend.Error) {
console.warn("Error!")
return
}
console.log("Backend loaded successfully")
}Lorsque vous utilisez QQmlEngine ou QQmlApplicationEngine, il existe des options plus simples ; voir Choisir la bonne méthode d'intégration entre C++ et QML pour plus d'informations.
backend.h:
#include <QObject> #include <QJSEngine> class Backend : public QObject { Q_OBJECT public: Backend(QJSEngine *engine); enum Status { Unknown, Error, Loading, Loaded }; Q_ENUM(Status) bool load(); private: QJSEngine *mEngine = nullptr; };
backend.cpp:
#include "backend.h"Backend::Backend(QJSEngine *engine) : mEngine(engine) { }bool Backend::load() { // Faire un peu de chargement ici... const QJSValue module = mEngine->importModule(":/script.mjs") ; if (module.isError()) { qWarning() << "Error loading script.mjs:" << module.toString(); return false; } const QJSValue function = module.property("backendStatusUpdate") ; if (!function.isCallable()) { qWarning() << "backendStatusUpdate script function is not callable!"; return false; } const QJSValue functionResult = function.call(QJSValueList()<< Loaded) ; if (functionResult.isError()) { qWarning() << "backendStatusUpdate script function had errors:" << functionResult.toString(); return false; } return true; }
Pour plus d'informations, voir QObject Integration.
Créer une jauge
Nous avons préparé un exemple composé de quelques fichiers C++ et QML qui démontrent comment procéder. Ils peuvent être utilisés dans votre application de la manière suivante :
import QtQuick.Controls import GaugeHowTo ApplicationWindow { width: 400 height: 400 title: qsTr("Gauge example") Gauge { minimumValue: 0 value: 75 maximumValue: 100 } }

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.

