2016-11-07 1 views
-1

ci-dessous est mon extrait de code où je charge ui QML en utilisant la méthode de création d'un objet dynamique maintenant je dois mettre en œuvre MouseArea qui résident dans le fichier chargé, quelqu'un peut me aider à faire ceComment utiliser la zone de clic de souris à partir du formulaire chargé en qml?

Qt.createQmlObject(" import QtQuick 2.0 

    Loader { 
     id: pageLoader 
     source: '/HomeScreenForm.ui.qml' 
     anchors.fill: parent 
     anchors.rightMargin: 0 
     anchors.leftMargin: 0 
     anchors.bottomMargin: parent 
     anchors.topMargin: parent 

     } 


     ", rectangle7) 
+1

Vous pouvez utiliser le type 'Connections' pour connecter des signaux et des fonctions à d'autres signaux. http://doc.qt.io/qt-5/qtqml-syntax-signals.html#using-the-connections-type Pour une aide supplémentaire, une récupération de votre fichier chargé sera nécessaire. – derM

+1

Quel sens de créer 'Loader' avec' createQmlObject'? Utilisez 'Qt.createComponent' à la place. – folibis

+0

La raison de l'utilisation de createQmlObject est que je veux charger le fichier qml sur rectangle7 et que le fichier chargé doit être responsive @folibis – jay

Répondre

1

Créer un élément personnalisé contient MouseArea . Pour rendre la zone accessible depuis l'extérieur, vous pouvez utiliser alias, par exemple:

MyItem.qml

import QtQuick 2.7 

Rectangle { 
    id: root 
    color: "yellow" 
    property alias area: mouseArea 

    MouseArea { 
     id: mouseArea 
     anchors.fill: parent 
    } 

    Text { 
     anchors.centerIn: parent 
     text: "Click me!" 
    } 
} 

Et vous pouvez créer dynamiquement:

import QtQuick 2.7 
import QtQuick.Window 2.0 

Window { 
    id: mainWindow 
    width: 600 
    height: 600 
    visible: true 

    Component.onCompleted: { 
     var component = Qt.createComponent("MyItem.qml"); 
     if (component.status === Component.Ready) { 
      var obj = component.createObject(mainWindow); 
      obj.width = 200; 
      obj.height = 200; 
      obj.anchors.centerIn = mainWindow.contentItem; 
      obj.area.onPressed.connect(
        function(mouse){ 
         console.log("pressed at (", mouse.x,",",mouse.y,")") 
        }); 
     } 
    } 
} 

Une autre façon utilise Connections, comme @derM déjà remarqué.

+0

Bien, je n'étais pas au courant du fait, que vous pouvez définir les id comme alias-cibles. Cela va rendre ma vie plus facile! – derM

+0

Merci ça marche nw – jay

+0

Vous ne savez pas pourquoi cela nécessite un chargement unique à l'aide de createObject(), car cela peut facilement être fait avec un 'Loader', qui permet ensuite de charger à la demande, de décharger, etc. joliment déclaratif –