2016-10-18 6 views
0

У меня есть 2 файла qml.Установить свойство QML из другого QML

Я хочу установить 2-й qml fromperty из 1-го qml-файла.

**first.qml** 

var cmponent = Qt.createComponent("second.qml"); 
    var newObj = cmponent.createObject(swipeView); 
    newObj.pageIndex = i; 
    swipeView.insertItem(swipeView.currentIndex+i,newObj) 

и вставить в SwipeView.

Где 'pageIndex' - целочисленное свойство 2-го qml. Во втором qml-файле у меня есть GridLayout с ячейками. мне нужно, чтобы отобразить содержимое ячейки на основе этой динамической pageIndex собственности

second.qml

заявленную собственность.

property int pageIndex: 0 
    onPageIndexChanged:{ 
     console.log("onPageIndexChanged :" +pageIndex) 
     home_grid.update() 

    } 

onPageIndexChanged метод срабатывает, но я хочу, чтобы установить ячейки сетки на основе стоимости недвижимости.

Вопрос заключается в Во время инициализации компонента

var cmponent = Qt.createComponent("second.qml"); 

клетки погружали в GridLayout.

Как я могу решить эту проблему.

+1

1: Почему вы создаете объекты с помощью JS-функций? 2: Где находится ваш GridLayout? Каковы ячейки, которые вы хотите отобразить там? Не можете ли вы использовать GridView с индексом в качестве модели? – derM

+0

1. Я хочу динамически создавать представления. основанный на подсчете ListModel. В каждом представлении есть сетка с максимальными элементами 6. Пример: у модели есть 7 элементов, тогда 6 элементов отображаются в первом представлении, а остальные 1 - на sendView с помощью swipeView для переключения этих представлений. 2. «GridLayout» находится в другом файле qml (second.qml). Каждая ячейка/элементы отображаются в сетке из значений, основанных на модели. –

+0

Должно быть возможно использовать один «ListModel» в нескольких представлениях. Поэтому я бы предложил использовать «GridView» вместо «GridLayout». Затем вы можете просто использовать «волшебную» переменную 'index' в делегатах этого« GridView »для ваших целей. – derM

ответ

0

Я думаю, что вы хотите это:

(я использовал мой пример для кулачного вопроса) Он должен иллюстрировать свои комментарии. Конечно, вы можете поместить различные виды в разные файлы. Вам просто нужно передать одну и ту же модель для обоих при создании объектов.

ListModel { 
    id: lm 
    ListElement { width: 40; height: 40 } 
    [...] 
    ListElement { width: 40; height: 40 } 
} 

SwipeView { 
    width: 200 
    height: 800 
    clip: true 
    currentIndex: 0 

    Repeater { 
     model: Math.ceil(lm.count/6) 
     delegate:   ListView { 
      width: 200 
      height: 800 
      property int viewIndex: index 
      model: DelegateModel { 
       model: lm 
       groups: DelegateModelGroup { name: 'filter' } 
       Component.onCompleted: { 
        for (var i = viewIndex * 6; i < lm.count && i < (viewIndex * 6) + 6; i++) { 
         items.setGroups(i, 1, ['items', 'filter']) 
        } 
       } 

       filterOnGroup: 'filter' 

       delegate: Rectangle { 
        width: 180 
        height: 30 
        border.width: 1 
        Text { 
         anchors.centerIn: parent 
         text: index 
        } 
       } 
      } 
     } 
    } 
} 

GridView { 
    clip: true 
    x: 300 
    width: 600 
    height: 600 
    model: lm 

    delegate: TestObj { 
    } 
} 

Вот код для делегата TestObj

Rectangle { 
    width: model.width 
    height: model.height 
    property alias text: myText.text 
    Text { 
     id: myText 
     anchors.centerIn: parent 
     text: index 
    } 
} 

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

delegate: TestObj { 
     width: model.width; height: model.height; text: index 
    } 

, который позволит свести к минимуму зависимости от вашего второго QML-файла.

+0

В GridItem я должен отображать множество элементов и основываться на некоторых условиях условий. Поэтому я создал отдельный QML для элемента Grid. –

+0

Это зависит от вас. Как вы видите, я тоже это сделал, с TestObj.qml – derM

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