2014-09-04 9 views
7

ho cominciato QML imparando e sto ottenendo il seguente errore:Impossibile accedere elemento QML da id all'interno SplitView

ReferenceError: chatTextArea is not defined

Ho una funzione globale che fa qualcosa su un elemento all'interno della stessa QML file, per id.

Per qualche motivo non riesco ad accedere tramite l'ID della mia TextArea o di qualsiasi elemento all'interno di SplitView. Ma sono in grado di manipolare le proprietà di TabView e ogni scheda.

Il mio codice rotto:

import QtQuick 2.2 
import QtQuick.Controls 1.1 
import QtQuick.Layouts 1.1 

Rectangle { 
id: lobby 

function appendChatMsg(msg) { 
    chatTextArea.append(msg) //causes: ReferenceError: chatTextArea is not defined 
} 

TabView { 
    id: frame 

    Tab { //I CAN access this item via ID. 
     id: controlPage 

     SplitView { 
      anchors.fill: parent 

      TableView { 
       Layout.fillWidth: true 
      } 

      GridLayout { 
       columns: 1 

       TextArea { //This item I CANNOT access via ID. 
        id: chatTextArea 

        Layout.fillHeight: true 
        Layout.fillWidth: true 
       } 

       TextField { 
        placeholderText: "Type something..." 
        Layout.fillWidth: true 
       } 
      } 
     } 
    } 
} 
} 

Qualsiasi idea del perché chatTextArea è fuori dalla portata della mia funzione? Grazie in anticipo.

risposta

3

Modificare la parte iniziale del codice a smth come questo:

import QtQuick 2.2 
import QtQuick.Controls 1.1 
import QtQuick.Layouts 1.1 

Rectangle { 
id: lobby 

function appendChatMsg(msg) { 
    controlPage.chatArea.append(msg) //causes: ReferenceError: chatTextArea is not defined 
} 

TabView { 
    id: frame 

    Tab { //I CAN access this item via ID. 
     id: controlPage 
     property Item chatArea: item.chatArea 

     SplitView { 
      property Item chatArea: chatTextArea 

motivo per cui funziona è che Tab risulta a comportarsi come un Loader (per la documentazione), il carico a seconda di quale Componente si dà essa; pertanto, lo SplitView nel codice è una specifica Componente e tale componente viene istanziato dal Tab in un contesto QML separato (parentado a quello dell'elemento radice del documento). Questo è il motivo per cui tutto ciò che si trova all'interno di quel contesto può vedere le cose nella catena dell'ambito (come la funzione appendMessage()), ma non il contrario :)

+0

Grazie! Questo ha rimosso l'errore. Tuttavia sto ancora avendo difficoltà. Sto cercando di rispondere a un segnale che si trova nel file QML "principale". My Lobby viene caricato dinamicamente in main.qml tramite un Loader. Come posso attivare la mia funzione all'interno di Lobby.qml quando viene attivato un segnale in main.qml? – jub

+0

È possibile raggiungere main tramite id attraverso la catena di ambito e connettersi al suo segnale tramite 'signalName.connect()', penso (probabilmente, nella Lobby 'onCompleted()'). – mlvljr

Problemi correlati