Bienvenue sur le forum !

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

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Tableau à 2 dimensions

Bonjour!

Je suis bloqué sur un exercice qui se serait avéré très simple en C++:

Je souhaite afficher une grille de rectangles, et au clic sur un rectangle, tous les autres rectangles de la ligne et de la colonne changent de couleur.
J'ai utilisé une GridView avec une fonction me permettant de convertir l'index du deleguate en coordonnées X, Y, mais en fait je n'ai aucune idée de comment accéder aux autres deleguates...
L'idéal serait de réaliser un tableau à 2 dimensions, mais en QML...

Merci d'avance pour votre aide!
Arnaud

Réponses

  • slt,
    voici une façon :
    import QtQuick 2.6
    import QtQuick.Window 2.2

    Window {
    visible: true
    width: 400; height: 400
    GridView {
    id: my_grid
    property int current_x: -1
    property int current_y: -1
    anchors.fill: parent
    model: 14
    delegate: Rectangle {
    id: my_delegate
    width: 90
    height: width
    color: {
    if( (my_delegate.x === my_grid.current_x)
    || (my_delegate.y === my_grid.current_y) )
    "yellow"
    else
    "gray"
    }
    Text {
    text: index + " x: " + parent.x + " y: " + parent.y
    }
    MouseArea {
    anchors.fill: parent
    onClicked: {
    my_grid.current_x = my_delegate.x
    my_grid.current_y = my_delegate.y
    }
    }
    }
    }
    }
  • Ah ouais, bien joué merci!

    Donc là on est dans du pur déclaratif.
    Maintenant comment serait-il possible de faire le lien entre un tableau C++ et une vue comme celle là? Par exemple, dans le tableau, à l'initialisation, certaines cases seront "vides", d'autres se verront attribuer une couleur.
    Un clic sur une case lancerait alors une méthode C++ qui contrôlerait les cases du tableau C++, et tout ceci est transmis à la vue QML. C'est possible?
  • Oui, et il y a aussi plusieurs façon de faire. Mais tu est un peu radin en détail pour pouvoir choisir la plus pertinente.
    Par exemple dans mon exemple, si tu modifies la taille de la fenêtre, la ligne et la colonne colorée ne change pas. Donc ici la couleur est lié à la vu et non au model.
    En tout cas, généralement la méthode la plus naturelle pour partager les données d'une GridView avec du C++ est l'utilisation d'un model en C++. Enfin, si tu as vraiment besoin du C++.
  • En fait c'est un projet perso de jeu, qui me permettrait de me faire la main à la fois en QML et Android.
    L'idée c'est que le joueur clique sur une case vide, et si cette case est le croisement de 2 autres cases de la même couleur, ça les élimine. Le but est de vider la grille.

    En C++ je vois assez bien comment m'y prendre, c'est pour ça que j'aurais préféré utiliser l'approche model-view. En gros mon tableau à 2 dimensions sera déclaré et géré par le C++ et le QML ne servira qu'à l'affichage.

    Dis moi si tu souhaites davantage de détails, en tout cas merci de ton aide!
  • A ma connaissance, le qml gère pas vraiment les models à 2 dimensions. L'exemple "Qt Quick Controls - Table View Example" est ce qui s'en rapproche le plus et tu remarquera qu'il utilise un ListModel.
    D'ailleurs GridView utilise un model de type liste.
    Ensuite si tu veux ton model en cpp, il faut l'implémenter avec QAbstractListModel. Regarde l'exemple avec du qml : "Models and Views: AbstractItemModel Example". C'est ce que je faisais au début mais je me suis ensuite simplifié la vie grâce à la video de Thomas BOUTROUE au QtWS15 et de sa lib qt-qml-tricks
    Voici un exemple :
    zip
    zip
    test_qml_model_with_libQtQmlTricks.zip
    103K
  • C'est ce que je faisais au début mais je me suis ensuite simplifié la vie grâce à la video de Thomas BOUTROUE au QtWS15 et de sa lib qt-qml-tricks
    Trop génial !!! :-) J'adopte, merci pour l'info !! ^^

    Effectivement le QML ne gère que les listes en modèles (pour toutes les vues Qt), et le TableView utilise des roles comme colonnes. Malheureusement...
  • Enfin un qui apprécie cette lib. Car cela fait une ou deux fois que je l’évoque mais pour laquelle je n'ai pas vu de réaction.
  • Dommage, parce qu'elle contient de nombreux p'tits trucs bien utiles, en vrac : le modèle-template pour créer un modèle en une ligne, les "helpers" pour les Q_PROPERTY, les additions au QML (polygones, rectangles qui peut avoir chaque bordures et coins arrondis différents, layouts améliorés...)
    Ça vaut vraiment le détour. Et en plus pas de licence contraignante...
  • Bonjour!

    Du coup j'ai pas compris grand chose... :-S Déjà, je trouve ça étonnant que ça n'existe pas en natif, il y a quand même beaucoup d'applications qui utilise une grille (je pense à 2048, mais également plein d'autres jeux).
    Et ensuite, je veux bien utiliser qt-qml-tricks, mais quelle classe?

    Merci d'avance!
Connectez-vous ou Inscrivez-vous pour répondre.