IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Quick Discussion :

Sub-context et QML


Sujet :

Qt Quick

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut Sub-context et QML
    Bonjour,

    Je voudrais assigner deux QDeclarativeContext différents à deux objets différents dans mon fichier QML.

    J'ai sèché toute la soirée, pas trouvé...

    La doc dit ceci :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    void QDeclarativeEngine::setContextForObject ( QObject * object, QDeclarativeContext * context ) [static]

    Sets the QDeclarativeContext for the object to context. If the object already has a context, a warning is output, but the context is not changed.
    Je ne vois donc pas comment je peux écraser le contexte courant par mon contexte...

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonsoir,

    Par défaut, un QDeclarativeEngine a déjà un QDeclarativeContext de défini (accessible par engine->rootContext()). Pourquoi avoir besoin d'en ajouter un ? Pour définir des propriétés contextuelles à un objet ?

    Vu que c'est une fonction statique, j'aurais fait :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QObject *object = ...;
    QDeclarativeContext *context = ...;
    QDeclarativeEngine::setContextForObject(object, context);

    Mais je suppose que c'est la première chose que tu as dû essayer.

    Bonne soirée,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    J'essaie de créer deux contexte différents attribués à deux objets différents. Ces deux contextes pouvant contenir des propriétés ayant le même nom. Je pourrais mettre tout dans le contexte root et m'arranger pour renommer mes propriétés, mais j'ai pas envie. J'aime me chercher les poux ^^

    Voici comment je m'en suis sorti :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Q_DECL_EXPORT int main(int argc, char *argv[])
    {
        QScopedPointer<QApplication> app(createApplication(argc, argv));
        QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());
     
        qsrand(QDateTime::currentDateTime().toTime_t());
     
        // Create solitaire context as a 'child' of the root context
        QScopedPointer<QDeclarativeContext> solitaireContext(new QDeclarativeContext(viewer->engine()->rootContext()));
        QScopedPointer<QDeclarativeContext> freecellContext(new QDeclarativeContext(viewer->engine()->rootContext()));
     
        // Initialize ce contexte avec l'interface du solitaire
        QScopedPointer<SolitaireToQmlInterface> solitaireInterface(new SolitaireToQmlInterface());
        solitaireInterface->initializeContext(solitaireContext.data());
        QScopedPointer<FreecellToQmlInterface> freecellInterface(new FreecellToQmlInterface());
        freecellInterface->initializeContext(freecellContext.data());
     
        // Build a freecell component
        QDeclarativeComponent freecellComponent(viewer->engine(), QUrl::fromLocalFile("qml/Freecell.qml"));
        QDeclarativeItem* freecellObject = qobject_cast<QDeclarativeItem *>(freecellComponent.create(freecellContext.data()));
        freecellObject->setOpacity(0);
        viewer->engine()->rootContext()->setContextProperty("freecell", freecellObject);
     
        // Build a solitaire component
        QDeclarativeComponent solitaireComponent(viewer->engine(), QUrl::fromLocalFile("qml/Solitaire.qml"));
        QDeclarativeItem* solitaireObject = qobject_cast<QDeclarativeItem *>(solitaireComponent.create(solitaireContext.data()));
        solitaireObject->setOpacity(0);
        viewer->engine()->rootContext()->setContextProperty("solitaire", solitaireObject);
     
        // Set main qml file to the viewer
        viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
        viewer->setMainQmlFile(QLatin1String("qml/main.qml"));
     
        // Reparent newly created objects to the rootObject
        freecellObject->setParentItem(qobject_cast<QDeclarativeItem*>(viewer->rootObject()));
        solitaireObject->setParentItem(qobject_cast<QDeclarativeItem*>(viewer->rootObject()));
        viewer->showExpanded();
     
        return app->exec();
    }

    Mon main.qml affiche simplement un menu qui permet de choisir entre les deux patiences à jouer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import QtQuick 1.0
     
    Item {
        id: rootItem
        // Have to set an initial size for desktop...
        width: 1100
        height: 800
     
        function backToMenu() {
            solitaire.opacity = 0;
            freecell.opacity = 0;
            menu.opacity = 1;
        }
     
        Menu {
            id: menu
            opacity: 1
            anchors.fill: parent
     
            onSolitaireClicked{
                menu.opacity = 0
                solitaire.opacity = 1
            }
     
            onFreecellClicked{
                menu.opacity = 0
                freecell.opacity = 1
            }
        }
     
        Component.onCompleted{
            solitaire.backClicked.connect(backToMenu)
            freecell.backClicked.connect(backToMenu)
        }
    }
    C'est le "setParentItem" que je n'avais pas hier soir.

    Pour la parenthèse, Amnell j'ai essayé de suivre ton conseil, j'ai tout regroupé dans une seul fichier qml et ai refait une QtQuick application. ce qui m'a amené à découvrir ce beau m***ier

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Classes, les QScopedPointer.

    Mais tu auras également pu faire comme ceci, tout simplement, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    import QtQuick 1.0
     
    Item {
        id: rootItem
        // Have to set an initial size for desktop...
        width: 1100
        height: 800
     
        function backToMenu() {
            solitaire.opacity = 0;
            freecell.opacity = 0;
            menu.opacity = 1;
        }
     
        Solitaire { id: solitaire }
        Freecell { id: freecell }
     
        Menu {
            id: menu
            opacity: 1
            anchors.fill: parent
     
            onSolitaireClicked{
                menu.opacity = 0
                solitaire.opacity = 1
            }
     
            onFreecellClicked{
                menu.opacity = 0
                freecell.opacity = 1
            }
        }
     
        Component.onCompleted{
            solitaire.backClicked.connect(backToMenu)
            freecell.backClicked.connect(backToMenu)
        }
    }
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Oui c'est ce que j'ai fait pour commencer, mais dans ce cas tu ne peux pas associer un "context object" différent pour le solitaire et pour le freecell.

    Le but d'avoir des contexte différent est :
    - Il existe un slot "newGame" dans les deux, et ils n'ont pas le même effet. Il faudrait alors avoir "newSolitaire" et "newFreecell".
    - Et dans ce cas rien n'interdirait le dev QML du solitaire de faire un "newFreecell" et de foutre le bazar partout.

    Ce qu'il se passe si on déclare le solitaire et la freecell dans le QML, un objet contextuel est créé par défaut et impossible à écraser, voir mon premier post.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  2. [] plusieurs instances de form avec leur contexte ?
    Par Seb-31 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/04/2003, 13h56
  3. Context menu Windows - icone pour un item
    Par Cameleon45 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 07/03/2003, 13h48
  4. Context Menu - ( Code de P. Castelain )
    Par Cameleon45 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 06/03/2003, 22h33
  5. Context sous Tomcat
    Par EL MANSOURI dans le forum JBuilder
    Réponses: 5
    Dernier message: 28/01/2003, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo