LINUX.ORG.RU

Repeater в QML

 ,


0

1

Здравствуйте. Начал изучать QT/QML под Android, хочу сделать небольшую проект, на подобии Pacman, но никак не могу понять как работает Repeater с Grid'ом, фактически в Pacman'не есть 4-ри сущности - стены, мой шарик, шарики соперников и шарики, которые я собираю. Для каждой сущности я создаю по qqmllistproperty в классе, qqmllistproperty уже работает с qml'ем, как задать нужное позиционирование объектов?, например, когда я запускаю игру, чтобы мой шарик отображался на позиции (2,2), а стена была бы на позиции (1,1), (1,2) и т.д. Для того чтобы разобраться с repeater, я создал простенький Grid 4х4 и в него поместил несколько repeater'ов с rectangle'ми в качестве моделей я указал числа и в итоге получилось не то что я хотел.

Можете, пожалуйста, объяснить как правильно с помощью repeater, задавать позиционирование объектов с C++ в qml'льном grid. И что лучше для таких целей canvas или grid?

В qml грид немного мутный. насколько я помню нет явной возможности указать позицию элемента в гриде, он строится на основе размеров элементов внутри. Мне кажется тут можно обойтись repeater'ом и расчетом x, y на основе размеров элемента и его позиции (которая соответственно в пропертях элемента передаётся)

SvSon
()

Здесь нужно понимать особенности синтаксиса QML. А именно параметры по умолчанию и компоненты.

Repeater {
    Item {}
}

это на самом деле короткая запись для:

Repeater {
    delegate: Component {
        Item {}
    }
}

Экземпляры компонента будут созданы на родителе Repeater'а в рантайме. Можно использовать attached property index для того чтобы определить порядковый номер созданного экземпляра. К примеру:

Grid {
	rows: 4
	columns: 4

	Repeater {
		model: 16
		Rectangle {
			width: 50; height: 50
			color: Qt.darker('red', 1.0 + index*0.1)
		}
	}
}
Dendy ★★★★★
()
Ответ на: комментарий от Dendy

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

Item {
	...
	Repeater {
		model: someModel
		Rectangle {
			x: modelData.column*width
			y: modelData.row*height
			width: 50
			height: 50
			...
		}
	}
}
А самим видом делегата управлять через Component в зависимости от например передаваемого типа ячейки, например, modelData.type

SvSon
()
Ответ на: комментарий от SvSon

Тогда можно засунуть Repeater не в Grid, а в GridLayout и attached properties GridLayout'а будут прикрепляться к экземплярам компонента Repeater'а, а именно нас интересуют Layout.row и Layout.column:

import QtQuick 2.0
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.0

ColumnLayout {
	property bool horizontalNotVertical: true

	Button {
		text: 'To ' + (horizontalNotVertical ? 'Vertical' : 'Horizontal')
		onClicked: horizontalNotVertical = !horizontalNotVertical;
	}

	GridLayout {
		rows: 4
		columns: 4

		Repeater {
			model: 16
			Rectangle {
				id: rect
				Layout.row: horizontalNotVertical ? (index % 4) : (index / 4)
				Layout.column: horizontalNotVertical ? (index / 4) : (index % 4)
				width: 50; height: 50
				color: Qt.darker('red', 1.0 + index*0.1)
				Text { text: '(' + rect.Layout.row + ':' + rect.Layout.column + ')'; anchors.centerIn: parent }
			}
		}
	}
}
Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.