2015-01-06 10 views
2

Как я могу изменить порядок элементов в GridLayout (или других контейнерах элементов QML)? У меня есть одно с некоторым количеством строк и столбцов и заполнено дочерними элементами. Еще несколько минут назад я надеялся, что я мог бы просто работать на элементе children списка пункта, чтобы изменить порядок их: у меня есть MouseArea кнопку в интерфейсе, из которого я надеялся, что может просто вызвать (из onClicked:) аКак изменить порядок элементов в QML GridLayout?

function reorder() {children.unshift(children.pop());} 

метод элемента компоновки (с намерением последнего элемента в макете став первым), но при запуске, который генерирует сообщение об ошибке:

TypeError: Property 'pop' of object [object Object] is not a function 

и в любом случае я отмечаю документация говорит children является только для чтения.

Есть ли простой способ сделать это? (documentation по управлению динамическими объектами на самом деле не охватывает больше, чем создание и уничтожение дочерних объектов.)

ответ

3

Вы можете использовать row и column.

+0

Ах, конечно! Я могу просто перебирать детей и правильно обновлять их; наблюдаемый макет не имеет ничего общего с фактическим приказом ребенка ... попробует его позже и примите этот ответ, если он сработает. Благодаря; один из тех случаев, когда я просто нуждался в ком-то, чтобы указать на ослепительно очевидное: ^) – timday

1

После ответа Митча, я пришел с этим:

function reorder() { 
    for (var i=0;i<children.length;i++) { 
     var index=columns*children[i].Layout.row + children[i].Layout.column; 
     var newIndex=(index+1)%(rows*columns); 
     children[i].Layout.row=Math.floor(newIndex/columns)%rows; 
     children[i].Layout.column=newIndex%columns; 
    } 
    } 

Есть несколько предостережений:

  • Для этой работы вы должны явным образом установить Layout.row и Layout.column на содержащийся предметов уже. Если вы полагаетесь на назначение ячейки GridLayout, прикрепленные свойства остаются равными нулю. Это было немного удивительно, поскольку я изначально читал documentation как подразумевающий, что GridLayout фактически установил их, если вы этого не сделали.
  • Вы также должны установить rows и columns на макет явно (для раскладок слева направо вы можете уйти, просто установив столбцы для целей компоновки макета ... но тогда свойство rows останется -1 независимо от того, сколько строк дочерних элементов, и приведенный выше код не будет работать).
  • Он выплевывает некоторые предупреждения консоли, такие как QGridLayoutEngine::addItem: Cell (1, 1) already taken, поскольку предметы перетасовываются. Кажется, это достаточно опасно.
  • Очевидно, что вышеизложенное действительно ожидает рассмотрения полностью заполненной сетки отдельных элементов ячейки.
Смежные вопросы