Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.0 - Qt Creator : 4.3.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Qt Quick Designer dummy context (Qt4)

Astuce pour l'édition de fichier qml via qt creator deisgner (V2.7).

Imaginez que vous devez éditer un fichier qml de ce style dans le designer de qtcreator:

import QtQuick 1.1

Rectangle {
id: root
width: paperRect.width
height: paperRect.height
color: "red"
}
La taille est donnée via le contexte et la propriété "paperRect" par le C++, par exemple :

view->engine()->rootContext()->setContextProperty("paperRect", printer.paperRect());
Le problème dans ce cas, c'est que l'édition dans qtcreator sera mauvaise car cette donnée est inconnue, comment alors éditer correctement le fichier qml ?
-> Avec l'aide des "faux contextes", mauvaise traduction de "dummy context"

à côté du fichier qml, créer un répertoire "dummydata" et y créer un fichier "paperRect.qml" du nom de la propriété à simuler. Le contenu du fichier sera comme suit :

import QtQuick 1.1

Item {
width: 2479
height: 3508
}
Maintenant Qt creator designer connaîtra la taille de votre rectangle et tout s'affichera bien mieux :)

Il est également possible de définir des types de propriété nouveau, simulant un objet complexe passé par le contexte du code C++, voici un autre exemple de données de simulation ("document.qml"):

import QtQuick 1.1

Item {
property string filename: "nom du fichiiiier"
property int pixelSize: 333
property bool newDocument: true
property bool modified: false
property int sensorRotation: 270
property int videoFrameTime: 1000
property variant imageSize: Qt.size(2048, 2048)
}
Note: la syntaxe de la propriété imageSize permet d'écrire ceci dans le fichier qml réel:

Text { text: "Original image size: " + document.imageSize.width + " x " + document.imageSize.height }
La documentation à ce sujet étant très sporadique, je partage mes trouvailles (j'ai du fouiller le code de qtcreator pour comprendre comment ça fonctionnait :p)

Réponses

  • Bravo et merci !
  • Techniquement, le dummyItem (défini dans le .qml du répertoire dummydata) est en fait chargé comme tout autre composant et ajouté au contexte courant avec pour nom de propriété le nom du fichier qml.
    Ceci est effectué pour chaque fichier qml trouvé dans le répertoire dummydata.

    Il est donc aussi possible de créer des fonctions javascript dans cet objet (qui vont simuler des fonctions complexes de notre objet C++) et de renvoyer des données valides afin que le visualisation dans l'éditeur soit correcte:

    import QtQuick 1.1

    Item {
    property string filename: "nom du fichiiiier"
    ....

    function getExtendedInfoValue(id) {
    if (id === "core.software.revision") return "V3.1.0";
    if (id === "core.sensorSerial") return "0005dc54ab68";
    if (id === "core.shot.object") return "Objet de test";
    if (id === "core.shot.description") return "Blablabla.";
    }
    }

Connectez-vous ou Inscrivez-vous pour répondre.