2017-10-19 7 views
0

J'ai un écran avec des rectangles qui peuvent contenir du texte. Le contenu du texte de ces rectangles devrait être autorisé à changer en cliquant sur les boutons de l'écran où ce composant est utilisé. Le problème que j'ai est comment savoir dans l'écran qui utilise ce composant quelle instance est sélectionnée. J'ai pensé à résoudre cela en émettant un signal, qui transmet l'identifiant de l'instance comme référence, mais il semble que cela ne fonctionne pas. Comment cela pourrait-il être accompli? Voici mon composant rectangle personnaliséQt QML: Référence à l'objet qui émet un signal

Rectangle { 
    id: root 
    width: 50 
    height: 50 
    color: "#000000" 
    anchors.verticalCenter: parent.verticalCenter 
    border.color: "#555555" 
    property int value: 0 
    signal sendId(Item) 

Text { 
    id: displayed_text 
    color: "#ffffff" 
    text: root.value 
    anchors.horizontalCenter: parent.horizontalCenter 
    anchors.verticalCenter: parent.verticalCenter 
    horizontalAlignment: Text.AlignHCenter 
    verticalAlignment: Text.AlignVCenter 
    font.pixelSize: 15 
} 

MouseArea { 
    id: mouseArea 
    anchors.fill: parent 
    onClicked: { 
     root.border.color="#222222" 
     root.sendId(root.id) 

    } 

} 

}

et ici le fichier où les autres boutons doivent modifier le contenu du composant personnalisé:

  property Item selected: myRectangle 
      function changeSelected(value) { 
       selected.value=5 
      } 
      function setSelected(it) { 
       root.selected=it 
      } 

      MyRectangle { 
       id: myRectangle 
       Component.onCompleted: { 
        myRectangle.sendId.connect(tempNumber.setSelected) 
       } 
      } 
      MyRectangle { 
       id: myRectangle1 
       Component.onCompleted: { 
        myRectangle1.sendId.connect(tempNumber.setSelected) 
       } 
      } 
      MyRectangle { 
       id: myRectangle2 
       Component.onCompleted: { 
        myRectangle2.sendId.connect(tempNumber.setSelected) 
       } 
      } 

Répondre

2
root.sendId(root.id) 

Le id est pas une propriété régulière . Ne l'utilisez pas comme tel. Le but du id est de vous une référence, avec laquelle vous pouvez vous référer à un objet particulier, tout ce que vous avez vraiment besoin est:

root.sendId(root) 

Et si root est votre fichier QML objet racine, sendId(root) fonctionnerait aussi Tant que sendId n'est pas dupliqué, les membres racine peuvent être référencés directement, gardez à l'esprit que cela s'applique uniquement à l'objet racine, cela ne fonctionnera pas pour un objet qui est un parent direct ou indirect mais pas un utilisateur root.

Il est recommandé de s'abstenir de tout donner id - n'utilisez les identifiants que lorsque vous avez vraiment besoin de référencer un objet particulier et qu'il n'existe aucun autre moyen.

Une autre chose qui vous manque est que contrairement aux fonctions JS, vous devez fournir une certaine typage pour un signal. Vous pouvez toujours utiliser var et passer n'importe quoi, mais il est généralement plus efficace d'affiner la portée. Vous avez donc besoin type et identifiant:

signal sendId(Item item) 

De cette façon, vous pouvez accéder à item les gestionnaires de signaux, de sorte que vous pouvez éviter la syntaxe de connexion impératif maladroit, donc au lieu que vous pouvez simplement:

 MyRectangle {    
      onSendId: tempNumber.setSelected(item) 
     } 

Cependant, Je dirais que votre design n'est pas optionnel. Les signaux sont censés être utilisés lorsque vous visez la généralité et la réutilisation. Votre scénario d'utilisation est plus spécifique, donc l'utilisation de signaux peut être totalement évitée:

// Rect.qml 
Rectangle { 
    width: 50 
    height: 50 
    color: manager.selected === this ? "red" : "blue" 
    MouseArea { 
    anchors.fill: parent 
    onClicked: manager.selected = parent 
    } 
} 

// main.qml 
Window { 
    id: manager 

    visible: true 
    width: 600 
    height: 300 

    property Item selected: null 

    Row { 
    spacing: 2 
    Repeater { 
     model: 10 
     delegate: Rect {} 
    } 
    } 
} 

Comme l'exemple suivant, vous pouvez accéder directement à des objets en identifiant aussi longtemps qu'ils se trouvent dans l'arbre d'objets. La même chose s'applique aux propriétés, cependant tandis que le id fonctionnera pour n'importe quel objet dans l'arbre, les propriétés ne fonctionneront que si elles sont déclarées dans l'objet racine du fichier qml particulier.

+0

Merci beaucoup! – numberCruncher