2017-02-01 1 views
0

Я использую ListView с моделью и делегатом.Доступ к таблице ListView в компоненте Repeater в делегате

Модель простая ListModel с тремя элементами. Каждый элемент имеет значение с ключом myFirstRole.

Делегат содержит компонент Repeater, чтобы создать произвольное число Labels. Labels должны использовать данные модели.

Модель ретранслятора не может быть установлен в модели Listview «s, как у меня есть Repeater, используя другие данные.

Вот минимальный пример того, что я пытаюсь достичь:

//MyDelegate.qml 
Component { 

    Item { 
     id: root 

     width: childrenRect.width 
     height childrenRect.height 

     Repeater { 
      model: 5 //It's not an option to set the repeaters model to the ListViews model. This example just illustrates my problem. 

      Label { 
       text: root.ListView.view.model.myFirstRole //This is the line where I want to be able to access the ListView's model, but I can't figure out how to properly reefer to it. 
      } 
     } 
    } 
} 

//MyListView.qml 
ListView { 
    id: root 

    delegate: MyDelegate {} 
    model: ListModel { 
     ListElement { 
      myFirstRole: "one" 
     } 
     ListElement { 
      myFirstRole: "two" 
     } 
     ListElement { 
      myFirstRole: "three" 
     } 
    } 
} 

Использование Qt 5.7.0 с MSVC2015 32bit

+1

Ваш пример не является полным. Я вообще не вижу «ListView», но вы упомянули это в заголовке. – folibis

+0

@folibis: Я не думал, что это необходимо, поскольку код ListView для этого примера - это не что-то иное, как стандартный шаблонный код ListView. Я могу добавить его для полноты. – Phat

ответ

3

Я думаю, что вы не можете получить доступ к ролям через специальное свойство model, упомянутое here (это то, что я предполагаю, что вы пытались сделать) из области Repeater. Вместо этого, вы можете объявить свойство на уровне корневого компонента, которые затем могут быть использованы в вложенными областях:

import QtQuick 2.6 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width: 640 
    height: 480 

    ListView { 
     anchors.fill: parent 
     model: ListModel { 
      ListElement { myFirstRole: "Dog" } 
      ListElement { myFirstRole: "Cat" } 
     } 

     delegate: Item { 
      id: root 

      width: childrenRect.width 
      height: childrenRect.height 

      property string myFirstRoleData: myFirstRole 

      Repeater { 
       model: 5 

       Text { 
        text: myFirstRoleData 
       } 
      } 
     } 
    } 
} 

Это может получить немного утомительным, если у вас есть много свойств, хотя. От некоторых быстрых игр вокруг, похоже, это также можно хранить весь model объект в собственности:

import QtQuick 2.6 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width: 640 
    height: 480 

    ListView { 
     anchors.fill: parent 
     model: ListModel { 
      ListElement { myFirstRole: "Dog" } 
      ListElement { myFirstRole: "Cat" } 
     } 

     delegate: Item { 
      id: root 

      width: childrenRect.width 
      height: childrenRect.height 

      property var modelData: model 

      Repeater { 
       model: 5 

       Text { 
        text: root.modelData.myFirstRole 
       } 
      } 
     } 
    } 
} 

modelData, вероятно, не самое лучшее имя для использования, хотя, видя, как Qt использует это имя для моделей с только одна роль, но ... если вы собираетесь использовать этот подход, у вас будет больше одной роли. :)

Похоже, что Qt Quick Controls (1) Tumblerdoes this too.

+0

Я пробовал эту штуку, но это не сработало. Я попробую еще раз и отчитаюсь, если бы я просто устал ... – Phat

1
//MyDelegate.qml 
Item { 
    id: root 
    property var listViewModel // pass the model data to here 
    width: 100 
    height: 50 

    Column { 
     Repeater { 
      model: 5 // Use a different model here 
      Text { 
       width: 50 
       height: 10 
       text: listViewModel.myFirstRole //This is the line where I want to be able to access the ListView's model, but I can't figure out how to properly reefer to it. 
      } 
     } 
    } 
} 

//MyListView.qml 
ListView { 
    id: root 
    width: 100 
    height: 500 

    delegate: MyDelegate { 
     listViewModel: model // set the model data here 
    } 
    model: ListModel { 
     ListElement { 
      myFirstRole: "one" 
     } 
     ListElement { 
      myFirstRole: "two" 
     } 
     ListElement { 
      myFirstRole: "three" 
     } 
    } 
} 

Смотрите комментарии в коде. Нетрудно догадаться, чего вы хотите достичь, но я надеюсь, что догадался.

+0

Благодарим за предложение, но в моем исходном сообщении я написал комментарий в коде, что модель ретранслятора не может быть установлена ​​в модель listviews. Причина этого в том, что модель повторителей имеет другую модель, которую она должна использовать в моей программе. – Phat

+0

Хорошо, я попробую сделать следующее. То, что вы написали в своем вопросе, ... очень запутанно. – derM

+1

Так изменил. Надеюсь, это соответствует вашим потребностям. – derM

Смежные вопросы