2016-12-30 10 views
2

Я хочу получить доступ к моим элементам QML по ID из основного файла, но он не работает. В моем тесте (случай) среды у меня есть 2 файла:Qt: доступ к элементам произвольно по ID в QML

  1. main.qml, это файл, из которого я хочу, чтобы получить доступ по идентификатору
  2. Accounts.qml, это файл, в котором определен мой элемент

main.qml

import QtQuick 2.7 
import QtQuick.Controls 2.0 

Item { 

    Accounts { 
     id: accounts 
    } 
    Component.onCompleted: { 
     console.log(accounts); 
     console.log(accounts.accounts_pane); 
     console.log(accounts.list_area); 
     console.log(accounts.accounts_pane.list_area.list_column.list_identities.model); 
    } 
} 

Accounts.qml

import QtQuick 2.7 
import QtQuick.Controls 2.0 

Pane { 
    id: accounts_pane 
    anchors { 
     fill: parent 
    }  
    Rectangle { 
     id: list_area 
     border.color: "black" 
     border.width: 2 
     anchors { 
      left: parent.left 
      right: parent.right 
      top: parent.top 
      bottom: parent.bottom 
     } 
     Column { 
      id: list_column 
      ListView { 
       id: list_identities 
       width: list_area.width 
       height: 200 
       model: ListModel { 
        ListElement { 
         name: "Bill Smith" 
         number: "555 3264" 
        } 
        ListElement { 
         name: "John Brown" 
         number: "555 8426" 
        } 
       } 
       delegate: Text { 
        text: name + ',' + number 
       } 
      } 
     } 
    } 
} 

Итак, из файла main.qml я хочу изменить модель учетных записей (разные компании используют разные учетные записи), и мне нужно сделать это с помощью Javascript. (Моя модель - это класс C++, зарегистрированный в движке QML, но я буду использовать Javascript для переключения различных объектов модели). Нотация для доступа к модели, как я понимаю, должно быть что-то вроде этого:

accounts.accounts_pane.list_area.list_column.list_identities.model 

Однако при тестировании его с console.log():

console.log(accounts); 
    console.log(accounts.accounts_pane); 
    console.log(accounts.list_area); 
    console.log(accounts.accounts_pane.list_area.list_column.list_identities.model); 

Я не могу пройти мимо элемента Pane {}, который определен в Accounts.qml. Выход qmlscene показывает мне эти ошибки:

hier $ qmlscene main.qml 
qml: QQuickPane(0x13b85f0) 
qml: undefined 
qml: undefined 
file:///QT_snippets/qmlscenes/hier/main.qml:13: TypeError: Cannot read property 'list_area' of undefined 

Как вы можете получить доступ к элементам QML по ID произвольно из main.qml документа?

ответ

1

Вы должны использовать идентификатор только для доступа к объектам в том же файле QML. Несмотря на то, что в некоторых сценариях фанк, похоже, вы можете получить доступ через id в зависимости от структуры файлов QML. Кажется, что из внутреннего файла QML внешний. Реверс вашего сценария.

Если вы хотите получать доступ к элементам из других файлов QML, они должны отображаться как свойства. Кроме того, свойства, определенные в корневом файле QML, будут видны из всего проекта, если свойство с идентичным именем затеняет его.

Думайте о каждом объекте в файле QML как о закрытом, тогда как свойства общедоступны. если вы хотите получить доступ к одному из этих частных объектов, раскройте его как свойство.

property Item someItem : _item 
Item { id: _item } 

В вашем случае accounts_pane является излишним, так как она будет такой же, как accounts - это тот же самый объект.

Если вы подвергаете list_identities непосредственно вам не нужно подвергать все предыдущие объекты, чтобы получить к нему доступ:

accounts.accounts_pane.list_area.list_column.list_identities.model // no need 
accounts.list_identities.model // all you need 

Кроме того, вы можете выставить определенные свойства конкретных объектов в качестве псевдонимов:

// in Accounts.qml 
property alias mode: list_identities.model 
// then you can simply 
accounts.model 

Наконец, рассмотрите этот подход как ошибочный, вам не нужно выставлять все для внешнего использования, вы должны определить интерфейс, с помощью которого можно управлять внутренностями каждого компонента QML.

+0

спасибо!О интерфейсах, как вы его определяете? Является ли это функцией JavaScript? – Nulik

+0

@Nulik - это набор свойств, функций или псевдонимов - все, что вам нужно. Например, если вам нужно только установить модель, а затем выставить ее как псевдоним. – dtech