Make views example more in line with our guidelines

The views example is an old example, which shows off many different
features related to ListView, GridView and the QML models.

Unfortunately, there are currently a few things that are broken in it.
One of those things is the FlickrRssModel, which no longer works,
because flickr changed their web API.

This patch makes some improvements, but it's unfortunately not fixing
everything.
The list of fixes are the following:
- Fix a good number of qmllint warnings. Unfortunately, there seems to
  be a good number of false positives that remain unfixed.
- Use qsTr() in some places. But I've not adopted it everywhere.
- sections.qml now uses Qt Quick Controls CheckBox'es instead of a
  custom component.
- Property bindings are now declared on separate lines.

Change-Id: Idfb563f4bd658dc70c1b9975549e872e7c25449e
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
(cherry picked from commit c4d520c200)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Oliver Eftevaag 2023-06-28 15:30:40 +02:00 committed by Qt Cherry-pick Bot
parent 546eb1ac99
commit f6e1e53c0b
16 changed files with 604 additions and 193 deletions

View File

@ -19,14 +19,11 @@ qt_standard_project_setup(REQUIRES 6.5)
add_subdirectory("../shared" "shared")
qt_add_executable(viewsexample
WIN32
MACOSX_BUNDLE
main.cpp
)
set_target_properties(viewsexample PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(viewsexample PRIVATE
Qt6::Core
Qt6::Gui

View File

@ -5,6 +5,8 @@ import QtQml
import QtQuick
import QtQml.Models
pragma ComponentBehavior: Bound
Item {
id: root
@ -38,14 +40,33 @@ Item {
Drag.active: visibleContainer.drag.active
anchors { horizontalCenter: parent.horizontalCenter; verticalCenter: parent.verticalCenter }
anchors {
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
states: State {
when: visibleContainer.drag.active
AnchorChanges { target: draggable; anchors { horizontalCenter: undefined; verticalCenter: undefined} }
ParentChange { target: selectionView; parent: draggable; x: 0; y: 0 }
PropertyChanges { root.dragging: true }
ParentChange { target: draggable; parent: root }
AnchorChanges {
target: draggable
anchors {
horizontalCenter: undefined
verticalCenter: undefined
}
}
ParentChange {
target: selectionView
parent: draggable
x: 0
y: 0
}
PropertyChanges {
root.dragging: true
}
ParentChange {
target: draggable
parent: root
}
}
}
DropArea {
@ -72,8 +93,16 @@ Item {
radius: 8
gradient: Gradient {
GradientStop { id: gradientStart; position: 0.0; color: "#8AC953" }
GradientStop { id: gradientEnd; position: 1.0; color: "#8BC953" }
GradientStop {
id: gradientStart
position: 0.0
color: "#8AC953"
}
GradientStop {
id: gradientEnd
position: 1.0
color: "#8BC953"
}
}
border.width: 2
@ -91,8 +120,13 @@ Item {
}
Rectangle {
anchors { right: parent.right; top: parent.top; margins: 3 }
width: 12; height: 12
anchors {
right: parent.right
top: parent.top
margins: 3
}
width: 12
height: 12
color: packageRoot.DelegateModel.inSelected ? "black" : "white"
radius: 6
@ -108,27 +142,55 @@ Item {
states: [
State {
name: "selected"
ParentChange { target: content; parent: selectionContainer; x: 3; y: 3 }
ParentChange {
target: content
parent: selectionContainer
x: 3
y: 3
}
PropertyChanges {
packageRoot.DelegateModel.inItems: visibleContainer.drag.active
gradientStart.color: "#017423"
}
PropertyChanges { gradientStart.color: "#007423" }
PropertyChanges {
gradientStart.color: "#007423"
}
}, State {
name: "visible"
PropertyChanges { packageRoot.DelegateModel.inItems: true }
ParentChange { target: content; parent: visibleContainer; x: 3; y: 3 }
PropertyChanges { gradientStart.color: "#8AC953" }
PropertyChanges { gradientStart.color: "#8BC953" }
PropertyChanges {
packageRoot.DelegateModel.inItems: true
}
ParentChange {
target: content
parent: visibleContainer
x: 3
y: 3
}
PropertyChanges {
gradientStart.color: "#8AC953"
}
PropertyChanges {
gradientStart.color: "#8BC953"
}
}
]
transitions: Transition {
PropertyAction { target: packageRoot; properties: "DelegateModel.inItems" }
PropertyAction {
target: packageRoot
properties: "DelegateModel.inItems"
}
ParentAnimation {
target: content
NumberAnimation { target: content; properties: "x,y"; duration: 500 }
NumberAnimation {
target: content
properties: "x,y"
duration: 500
}
}
ColorAnimation {
targets: [gradientStart, gradientEnd]
duration: 500
}
ColorAnimation { targets: [gradientStart, gradientEnd]; duration: 500 }
}
}
}
@ -139,7 +201,10 @@ Item {
model: 35
delegate: packageDelegate
groups: DelegateModelGroup { id: selectedItems; name: "selected" }
groups: DelegateModelGroup {
id: selectedItems
name: "selected"
}
Component.onCompleted: parts.selection.filterOnGroup = "selected"
}
@ -155,13 +220,16 @@ Item {
path: Path {
startX: 0
startY: 0
PathLine { x: 64; y: 64 }
PathLine {
x: 64
y: 64
}
}
}
GridView {
id: itemsView
anchors { fill: parent }
anchors.fill: parent
cellWidth: 64
cellHeight: 64
model: visualModel.parts.visible

View File

@ -5,12 +5,15 @@ import QtQuick
import QtQml.Models
import shared as Shared
pragma ComponentBehavior: Bound
Rectangle {
id: root
property Item displayItem: null
width: 300; height: 400
width: 300
height: 400
color: "black"
@ -25,13 +28,17 @@ Rectangle {
delegate: Item {
id: delegateItem
width: 76; height: 76
width: 76
height: 76
required property string thumbnail
Rectangle {
id: image
x: 0; y: 0; width: 76; height: 76
x: 0
y: 0
width: 76
height: 76
border.width: 1
border.color: "white"
color: "black"
@ -56,7 +63,14 @@ Rectangle {
State {
when: root.displayItem === delegateItem
name: "inDisplay";
ParentChange { target: image; parent: imageContainer; x: 75; y: 75; width: 150; height: 150 }
ParentChange {
target: image
parent: imageContainer
x: 75
y: 75
width: 150
height: 150
}
PropertyChanges {
image.z: 2
delegateItem.DelegateModel.inItems: false
@ -65,7 +79,14 @@ Rectangle {
State {
when: root.displayItem !== delegateItem
name: "inList";
ParentChange { target: image; parent: delegateItem; x: 2; y: 2; width: 75; height: 75 }
ParentChange {
target: image
parent: delegateItem
x: 2
y: 2
width: 75
height: 75
}
PropertyChanges {
image.z: 1
delegateItem.DelegateModel.inItems: true
@ -77,11 +98,19 @@ Rectangle {
Transition {
from: "inList"
SequentialAnimation {
PropertyAction { target: delegateItem; property: "DelegateModel.inPersistedItems"; value: true }
PropertyAction {
target: delegateItem
property: "DelegateModel.inPersistedItems"
value: true
}
ParentAnimation {
target: image;
via: root
NumberAnimation { target: image; properties: "x,y,width,height"; duration: 1000 }
NumberAnimation {
target: image
properties: "x,y,width,height"
duration: 1000
}
}
}
}, Transition {
@ -89,9 +118,17 @@ Rectangle {
SequentialAnimation {
ParentAnimation {
target: image
NumberAnimation { target: image; properties: "x,y,width,height"; duration: 1000 }
NumberAnimation {
target: image
properties: "x,y,width,height"
duration: 1000
}
}
PropertyAction {
target: delegateItem
property: "DelegateModel.inPersistedItems"
value: false
}
PropertyAction { target: delegateItem; property: "DelegateModel.inPersistedItems"; value: false }
}
}
]

View File

@ -4,7 +4,8 @@
import QtQuick
Rectangle {
width: 300; height: 400
width: 300
height: 400
color: "white"
ListModel {
@ -20,26 +21,36 @@ Rectangle {
//! [0]
GridView {
anchors.fill: parent
cellWidth: 100; cellHeight: 100
cellWidth: 100
cellHeight: 100
focus: true
model: appModel
highlight: Rectangle { width: 80; height: 80; color: "lightsteelblue" }
highlight: Rectangle {
width: 80
height: 80
color: "lightsteelblue"
}
delegate: Item {
required property string icon
required property string name
required property int index
width: 100; height: 100
width: 100
height: 100
Image {
id: myIcon
y: 20; anchors.horizontalCenter: parent.horizontalCenter
y: 20
anchors.horizontalCenter: parent.horizontalCenter
source: parent.icon
}
Text {
anchors { top: myIcon.bottom; horizontalCenter: parent.horizontalCenter }
anchors {
top: myIcon.bottom
horizontalCenter: parent.horizontalCenter
}
text: parent.name
}
MouseArea {

View File

@ -8,7 +8,7 @@ Image {
property int repeatDelay: 300
property int repeatDuration: 75
property bool pressed: false
property bool pressed
signal clicked

View File

@ -4,6 +4,6 @@
import QtQuick
Text {
font.pixelSize: 12
font.pointSize: 9
}

View File

@ -34,7 +34,8 @@ Item {
Rectangle {
id: header
width: parent.width; height: 40
width: parent.width
height: 40
color: "#AAFF0000"
Text {
@ -47,7 +48,8 @@ Item {
Rectangle {
id: footer
anchors.bottom: parent.bottom
width: parent.width; height: 40
width: parent.width
height: 40
color: "#AAFF0000"
Text {

View File

@ -6,9 +6,12 @@ import "content"
// This example shows how items can be dynamically added to and removed from
// a ListModel, and how these list modifications can be animated.
pragma ComponentBehavior: Bound
Rectangle {
id: container
width: 500; height: 400
width: 500
height: 400
color: "#343434"
// The model:
@ -16,30 +19,48 @@ Rectangle {
id: fruitModel
ListElement {
name: "Apple"; cost: 2.45
name: "Apple"
cost: 2.45
attributes: [
ListElement { description: "Core" },
ListElement { description: "Deciduous" }
ListElement {
description: "Core"
},
ListElement {
description: "Deciduous"
}
]
}
ListElement {
name: "Banana"; cost: 1.95
name: "Banana"
cost: 1.95
attributes: [
ListElement { description: "Tropical" },
ListElement { description: "Seedless" }
ListElement {
description: "Tropical"
},
ListElement {
description: "Seedless"
}
]
}
ListElement {
name: "Cumquat"; cost: 3.25
name: "Cumquat"
cost: 3.25
attributes: [
ListElement { description: "Citrus" }
ListElement {
description: "Citrus"
}
]
}
ListElement {
name: "Durian"; cost: 9.95
name: "Durian"
cost: 9.95
attributes: [
ListElement { description: "Tropical" },
ListElement { description: "Smelly" }
ListElement {
description: "Tropical"
},
ListElement {
description: "Smelly"
}
]
}
}
@ -51,7 +72,8 @@ Rectangle {
Item {
//! [0]
id: delegateItem
width: listView.width; height: 80
width: listView.width
height: 80
clip: true
required property int index
@ -83,7 +105,7 @@ Rectangle {
Column {
anchors {
left: arrows.right
horizontalCenter: parent.horizontalCenter;
horizontalCenter: parent.horizontalCenter
bottom: parent.verticalCenter
}
@ -155,18 +177,42 @@ Rectangle {
//! [1]
SequentialAnimation {
id: addAnimation
PropertyAction { target: delegateItem; property: "height"; value: 0 }
NumberAnimation { target: delegateItem; property: "height"; to: 80; duration: 250; easing.type: Easing.InOutQuad }
PropertyAction {
target: delegateItem
property: "height"
value: 0
}
NumberAnimation {
target: delegateItem
property: "height"
to: 80
duration: 250
easing.type: Easing.InOutQuad
}
}
ListView.onAdd: addAnimation.start()
SequentialAnimation {
id: removeAnimation
PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: true }
NumberAnimation { target: delegateItem; property: "height"; to: 0; duration: 250; easing.type: Easing.InOutQuad }
PropertyAction {
target: delegateItem
property: "ListView.delayRemove"
value: true
}
NumberAnimation {
target: delegateItem
property: "height"
to: 0
duration: 250
easing.type: Easing.InOutQuad
}
// Make sure delayRemove is set back to false so that the item can be destroyed
PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: false }
PropertyAction {
target: delegateItem
property: "ListView.delayRemove"
value: false
}
}
ListView.onRemove: removeAnimation.start()
}
@ -177,8 +223,10 @@ Rectangle {
ListView {
id: listView
anchors {
left: parent.left; top: parent.top;
right: parent.right; bottom: buttons.top;
left: parent.left
top: parent.top
right: parent.right
bottom: buttons.top
margins: 20
}
model: fruitModel
@ -187,11 +235,15 @@ Rectangle {
Row {
id: buttons
anchors { left: parent.left; bottom: parent.bottom; margins: 20 }
anchors {
left: parent.left
bottom: parent.bottom
margins: 20
}
spacing: 10
TextButton {
text: "Add an item"
text: qsTr("Add an item")
onClicked: {
fruitModel.append({
"name": "Pizza Margarita",
@ -202,7 +254,7 @@ Rectangle {
}
TextButton {
text: "Remove all items"
text: qsTr("Remove all items")
onClicked: fruitModel.clear()
}
}

View File

@ -8,7 +8,8 @@ import "content"
Rectangle {
id: page
width: 400; height: 240
width: 400
height: 240
color: "black"
// Delegate for the recipes. This delegate has two modes:
@ -31,13 +32,16 @@ Rectangle {
// want to fade.
property real detailsOpacity : 0
//! [0]
width: listView.width
width: ListView.view.width
height: 70
// A simple rounded rectangle for the background
Rectangle {
id: background
x: 2; y: 2; width: parent.width - x*2; height: parent.height - y*2
x: 2
y: 2
width: parent.width - x * 2
height: parent.height - y * 2
color: "ivory"
border.color: "orange"
radius: 5
@ -58,26 +62,32 @@ Rectangle {
Row {
id: topLayout
x: 10; y: 10; height: recipeImage.height; width: parent.width
x: 10
y: 10
height: recipeImage.height
width: parent.width
spacing: 10
Image {
id: recipeImage
width: 50; height: 50
width: 50
height: 50
source: recipe.picture
}
//! [1]
Column {
width: background.width - recipeImage.width - 20; height: recipeImage.height
width: background.width - recipeImage.width - 20
height: recipeImage.height
spacing: 5
Text {
text: recipe.title
font.bold: true; font.pointSize: 16
font.bold: true
font.pointSize: 16
}
SmallText {
text: "Ingredients"
text: qsTr("Ingredients")
font.bold: true
opacity: recipe.detailsOpacity
}
@ -94,22 +104,32 @@ Rectangle {
//! [2]
Item {
id: details
x: 10; width: parent.width - 20
x: 10
width: parent.width - 20
anchors { top: topLayout.bottom; topMargin: 10; bottom: parent.bottom; bottomMargin: 10 }
anchors {
top: topLayout.bottom
topMargin: 10
bottom: parent.bottom
bottomMargin: 10
}
opacity: recipe.detailsOpacity
//! [2]
SmallText {
id: methodTitle
anchors.top: parent.top
text: "Method"
font.pointSize: 12; font.bold: true
text: qsTr("Method")
font.pointSize: 12
font.bold: true
}
Flickable {
id: flick
width: parent.width
anchors { top: methodTitle.bottom; bottom: parent.bottom }
anchors {
top: methodTitle.bottom
bottom: parent.bottom
}
contentHeight: methodText.height
clip: true
@ -122,13 +142,19 @@ Rectangle {
}
Image {
anchors { right: flick.right; top: flick.top }
anchors {
right: flick.right
top: flick.top
}
source: "content/pics/moreUp.png"
opacity: flick.atYBeginning ? 0 : 1
}
Image {
anchors { right: flick.right; bottom: flick.bottom }
anchors {
right: flick.right
bottom: flick.bottom
}
source: "content/pics/moreDown.png"
opacity: flick.atYEnd ? 0 : 1
}
@ -138,9 +164,12 @@ Rectangle {
// A button to close the detailed view, i.e. set the state back to default ('').
TextButton {
y: 10
anchors { right: background.right; rightMargin: 10 }
anchors {
right: background.right
rightMargin: 10
}
opacity: recipe.detailsOpacity
text: "Close"
text: qsTr("Close")
onClicked: recipe.state = '';
}
@ -180,8 +209,14 @@ Rectangle {
transitions: Transition {
// Make the state changes smooth
ParallelAnimation {
ColorAnimation { property: "color"; duration: 500 }
NumberAnimation { duration: 300; properties: "detailsOpacity,x,contentY,height,width" }
ColorAnimation {
property: "color"
duration: 500
}
NumberAnimation {
duration: 300
properties: "detailsOpacity,x,contentY,height,width"
}
}
}
}
@ -192,7 +227,7 @@ Rectangle {
ListView {
id: listView
anchors.fill: parent
model: RecipesModel {}
model: RecipesModel { }
delegate: recipeDelegate
}
}

View File

@ -9,13 +9,15 @@ import QtQuick
import "content"
Rectangle {
width: 200; height: 300
width: 200
height: 300
// Define a delegate component. The component will be
// instantiated for each visible item in the list.
component PetDelegate: Item {
id: pet
width: 200; height: 55
width: 200
height: 55
required property int index
required property string name
@ -23,9 +25,15 @@ Rectangle {
required property int age
Column {
SmallText { text: 'Name: ' + pet.name }
SmallText { text: 'Type: ' + pet.type }
SmallText { text: 'Age: ' + pet.age }
SmallText {
text: 'Name: ' + pet.name
}
SmallText {
text: 'Type: ' + pet.type
}
SmallText {
text: 'Age: ' + pet.age
}
}
// indent the item if it is the current item
states: State {
@ -34,7 +42,10 @@ Rectangle {
PropertyChanges { pet.x: 20 }
}
transitions: Transition {
NumberAnimation { properties: "x"; duration: 200 }
NumberAnimation {
properties: "x"
duration: 200
}
}
MouseArea {
anchors.fill: parent
@ -45,24 +56,31 @@ Rectangle {
//! [0]
// Define a highlight with customized movement between items.
component HighlightBar : Rectangle {
width: 200; height: 50
width: 200
height: 50
color: "#FFFF88"
y: listView.currentItem.y
Behavior on y { SpringAnimation { spring: 2; damping: 0.1 } }
y: ListView.view.currentItem.y
Behavior on y {
SpringAnimation {
spring: 2
damping: 0.1
}
}
}
ListView {
id: listView
width: 200; height: parent.height
width: 200
height: parent.height
x: 30
model: PetsModel {}
delegate: PetDelegate {}
model: PetsModel { }
delegate: PetDelegate { }
focus: true
// Set the highlight delegate. Note we must also set highlightFollowsCurrentItem
// to false so the highlight delegate can control how the highlight is moved.
highlight: HighlightBar {}
highlight: HighlightBar { }
highlightFollowsCurrentItem: false
}
//! [0]

View File

@ -4,6 +4,8 @@
import QtQuick
import "content"
pragma ComponentBehavior: Bound
//! [0]
Rectangle {
id: root
@ -30,17 +32,26 @@ Rectangle {
}
}
PauseAnimation { duration: 500 }
PauseAnimation {
duration: 500
}
}
//! [0]
MouseArea{
MouseArea {
id: ma
z: 1
anchors.fill: parent
onClicked: { z = 1 - z; if (anim.running) anim.stop(); else anim.restart();}
onClicked: function () {
z = 1 - z;
if (anim.running)
anim.stop();
else
anim.restart();
}
}
width: 320; height: 480
width: 320
height: 480
// This example shows the same model in three different ListView items,
// with different highlight ranges. The highlight ranges are set by the
@ -68,12 +79,16 @@ Rectangle {
//! [1]
ListView {
id: list1
height: 50; width: parent.width
model: PetsModel {id: aModel}
height: 50
width: parent.width
model: PetsModel {
id: aModel
}
delegate: petDelegate
orientation: ListView.Horizontal
highlight: Rectangle { color: "lightsteelblue" }
highlight: Rectangle {
color: "lightsteelblue"
}
currentIndex: root.current
onCurrentIndexChanged: root.current = currentIndex
focus: true
@ -82,29 +97,33 @@ Rectangle {
ListView {
id: list2
y: 160
height: 50; width: parent.width
model: PetsModel {}
height: 50
width: parent.width
model: PetsModel { }
delegate: petDelegate
orientation: ListView.Horizontal
highlight: Rectangle { color: "yellow" }
highlight: Rectangle {
color: "yellow"
}
currentIndex: root.current
preferredHighlightBegin: 80; preferredHighlightEnd: 220
preferredHighlightBegin: 80
preferredHighlightEnd: 220
highlightRangeMode: ListView.ApplyRange
}
ListView {
id: list3
y: 320
height: 50; width: parent.width
height: 50
width: parent.width
model: PetsModel {}
delegate: petDelegate
orientation: ListView.Horizontal
highlight: Rectangle { color: "yellow" }
currentIndex: root.current
onCurrentIndexChanged: root.current = currentIndex
preferredHighlightBegin: 125; preferredHighlightEnd: 125
preferredHighlightBegin: 125
preferredHighlightEnd: 125
highlightRangeMode: ListView.StrictlyEnforceRange
}
//! [1]
@ -123,9 +142,15 @@ Rectangle {
Column {
id: column
Text { text: 'Name: ' + petDelegateItem.name }
Text { text: 'Type: ' + petDelegateItem.type }
Text { text: 'Age: ' + petDelegateItem.age }
Text {
text: 'Name: ' + petDelegateItem.name
}
Text {
text: 'Type: ' + petDelegateItem.type
}
Text {
text: 'Age: ' + petDelegateItem.age
}
}
MouseArea {

View File

@ -5,7 +5,7 @@
// the ListView.section attached property.
import QtQuick
import "content"
import QtQuick.Controls
Rectangle {
id: container
@ -14,21 +14,67 @@ Rectangle {
ListModel {
id: animalsModel
ListElement { name: "Ant"; size: "Tiny" }
ListElement { name: "Flea"; size: "Tiny" }
ListElement { name: "Parrot"; size: "Small" }
ListElement { name: "Guinea pig"; size: "Small" }
ListElement { name: "Rat"; size: "Small" }
ListElement { name: "Butterfly"; size: "Small" }
ListElement { name: "Dog"; size: "Medium" }
ListElement { name: "Cat"; size: "Medium" }
ListElement { name: "Pony"; size: "Medium" }
ListElement { name: "Koala"; size: "Medium" }
ListElement { name: "Horse"; size: "Large" }
ListElement { name: "Tiger"; size: "Large" }
ListElement { name: "Giraffe"; size: "Large" }
ListElement { name: "Elephant"; size: "Huge" }
ListElement { name: "Whale"; size: "Huge" }
ListElement {
name: "Ant"
size: "Tiny"
}
ListElement {
name: "Flea"
size: "Tiny"
}
ListElement {
name: "Parrot"
size: "Small"
}
ListElement {
name: "Guinea pig"
size: "Small"
}
ListElement {
name: "Rat"
size: "Small"
}
ListElement {
name: "Butterfly"
size: "Small"
}
ListElement {
name: "Dog"
size: "Medium"
}
ListElement {
name: "Cat"
size: "Medium"
}
ListElement {
name: "Pony"
size: "Medium"
}
ListElement {
name: "Koala"
size: "Medium"
}
ListElement {
name: "Horse"
size: "Large"
}
ListElement {
name: "Tiger"
size: "Large"
}
ListElement {
name: "Giraffe"
size: "Large"
}
ListElement {
name: "Elephant"
size: "Huge"
}
ListElement {
name: "Whale"
size: "Huge"
}
}
//! [0]
@ -36,7 +82,7 @@ Rectangle {
Component {
id: sectionHeading
Rectangle {
width: container.width
width: ListView.view.width
height: childrenRect.height
color: "lightsteelblue"
@ -58,6 +104,7 @@ Rectangle {
model: animalsModel
delegate: Text {
required property string name
text: name
font.pixelSize: 18
}
@ -73,19 +120,23 @@ Rectangle {
anchors.bottom: parent.bottom
anchors.bottomMargin: 1
spacing: 1
ToggleButton {
label: "CurrentLabelAtStart"
onToggled: {
if (active)
CheckBox {
id: labelAtStartCheckBox
text: qsTr("CurrentLabelAtStart")
onClicked: {
if (checked)
view.section.labelPositioning |= ViewSection.CurrentLabelAtStart
else
view.section.labelPositioning &= ~ViewSection.CurrentLabelAtStart
}
}
ToggleButton {
label: "NextLabelAtEnd"
onToggled: {
if (active)
CheckBox {
id: labelAtEndCheckBox
text: qsTr("NextLabelAtEnd")
onClicked: {
if (checked)
view.section.labelPositioning |= ViewSection.NextLabelAtEnd
else
view.section.labelPositioning &= ~ViewSection.NextLabelAtEnd

View File

@ -7,6 +7,8 @@
import QtQuick
import QtQml.Models
pragma ComponentBehavior: Bound
Rectangle {
id: root
color: "lightgray"
@ -19,23 +21,41 @@ Rectangle {
id: itemModel
Rectangle {
width: view.width; height: view.height
width: view.width
height: view.height
color: "#FFFEF0"
Text { text: "Page 1"; font.bold: true; anchors.centerIn: parent }
Text {
anchors.centerIn: parent
text: qsTr("Page 1")
font.bold: true
}
Component.onDestruction: if (root.printDestruction) print("destroyed 1")
}
Rectangle {
width: view.width; height: view.height
width: view.width
height: view.height
color: "#F0FFF7"
Text { text: "Page 2"; font.bold: true; anchors.centerIn: parent }
Text {
anchors.centerIn: parent
text: qsTr("Page 2")
font.bold: true
}
Component.onDestruction: if (root.printDestruction) print("destroyed 2")
}
Rectangle {
width: view.width; height: view.height
width: view.width
height: view.height
color: "#F4F0FF"
Text { text: "Page 3"; font.bold: true; anchors.centerIn: parent }
Text {
anchors.centerIn: parent
text: qsTr("Page 3")
font.bold: true
}
Component.onDestruction: if (root.printDestruction) print("destroyed 3")
}
@ -43,18 +63,27 @@ Rectangle {
ListView {
id: view
anchors { fill: parent; bottomMargin: 30 }
anchors {
fill: parent
bottomMargin: 30
}
model: itemModel
preferredHighlightBegin: 0; preferredHighlightEnd: 0
preferredHighlightBegin: 0
preferredHighlightEnd: 0
highlightRangeMode: ListView.StrictlyEnforceRange
orientation: ListView.Horizontal
snapMode: ListView.SnapOneItem; flickDeceleration: 2000
snapMode: ListView.SnapOneItem
flickDeceleration: 2000
cacheBuffer: 200
}
//! [0]
Rectangle {
width: root.width; height: 30
anchors { top: view.bottom; bottom: parent.bottom }
width: root.width
height: 30
anchors {
top: view.bottom
bottom: parent.bottom
}
color: "gray"
Row {
@ -63,17 +92,18 @@ Rectangle {
Repeater {
model: itemModel.count
Rectangle {
delegate: Rectangle {
required property int index
width: 5; height: 5
width: 5
height: 5
radius: 3
color: view.currentIndex == index ? "blue" : "white"
color: view.currentIndex === index ? "blue" : "white"
MouseArea {
width: 20; height: 20
anchors.centerIn: parent
width: 20
height: 20
onClicked: view.currentIndex = parent.index
}
}

View File

@ -11,26 +11,50 @@ Package {
required property int index
required property string display
Text { id: listDelegate; width: parent.width; height: 25; text: 'Empty'; Package.name: 'list' }
Text { id: gridDelegate; width: parent.width / 2; height: 50; text: 'Empty'; Package.name: 'grid' }
Text {
id: listDelegate
width: parent.width
height: 25
text: 'Empty'
Package.name: 'list'
}
Text {
id: gridDelegate
width: parent.width / 2
height: 50
text: 'Empty'
Package.name: 'grid'
}
Rectangle {
id: wrapper
width: parent.width; height: 25
width: parent?.width ?? 0
height: 25
color: 'lightsteelblue'
Text { text: delegate.display; anchors.centerIn: parent }
Text {
text: delegate.display
anchors.centerIn: parent
}
state: delegate.upTo > delegate.index ? 'inGrid' : 'inList'
states: [
State {
name: 'inList'
ParentChange { target: wrapper; parent: listDelegate }
ParentChange {
target: wrapper
parent: listDelegate
}
},
State {
name: 'inGrid'
ParentChange {
target: wrapper; parent: gridDelegate
x: 0; y: 0; width: gridDelegate.width; height: gridDelegate.height
target: wrapper
parent: gridDelegate
x: 0
y: 0
width: gridDelegate.width
height: gridDelegate.height
}
}
]
@ -38,7 +62,10 @@ Package {
transitions: [
Transition {
ParentAnimation {
NumberAnimation { properties: 'x,y,width,height'; duration: 300 }
NumberAnimation {
properties: 'x,y,width,height'
duration: 300
}
}
}
]

View File

@ -4,16 +4,24 @@
import QtQuick
import QtQml.Models
pragma ComponentBehavior: Bound
Rectangle {
id: root
color: "white"
width: 320
height: 480
property int upTo: 0
property int upTo
SequentialAnimation on upTo {
loops: -1
NumberAnimation { to: 8; duration: 3500 }
NumberAnimation { to: 0; duration: 3500 }
NumberAnimation {
to: 8
duration: 3500
}
NumberAnimation {
to: 0
duration: 3500
}
}
ListModel {
@ -38,14 +46,14 @@ Rectangle {
ListView {
id: lv
height: parent.height/2
height: parent.height / 2
width: parent.width
model: visualModel.parts.list
}
GridView {
y: parent.height/2
height: parent.height/2
y: parent.height / 2
height: parent.height / 2
width: parent.width
cellWidth: width / 2
cellHeight: 50

View File

@ -4,24 +4,47 @@
import QtQuick
Rectangle {
width: 400; height: 240
width: 400
height: 240
color: "white"
ListModel {
id: appModel
ListElement { name: "Music"; icon: "pics/AudioPlayer_48.png" }
ListElement { name: "Movies"; icon: "pics/VideoPlayer_48.png" }
ListElement { name: "Camera"; icon: "pics/Camera_48.png" }
ListElement { name: "Calendar"; icon: "pics/DateBook_48.png" }
ListElement { name: "Messaging"; icon: "pics/EMail_48.png" }
ListElement { name: "Todo List"; icon: "pics/TodoList_48.png" }
ListElement { name: "Contacts"; icon: "pics/AddressBook_48.png" }
ListElement {
name: "Music"
icon: "pics/AudioPlayer_48.png"
}
ListElement {
name: "Movies"
icon: "pics/VideoPlayer_48.png"
}
ListElement {
name: "Camera"
icon: "pics/Camera_48.png"
}
ListElement {
name: "Calendar"
icon: "pics/DateBook_48.png"
}
ListElement {
name: "Messaging"
icon: "pics/EMail_48.png"
}
ListElement {
name: "Todo List"
icon: "pics/TodoList_48.png"
}
ListElement {
name: "Contacts"
icon: "pics/AddressBook_48.png"
}
}
Component {
id: appDelegate
Item {
width: 100; height: 100
width: 100
height: 100
scale: PathView.iconScale
required property string name
@ -30,11 +53,15 @@ Rectangle {
Image {
id: myIcon
y: 20; anchors.horizontalCenter: parent.horizontalCenter
y: 20
anchors.horizontalCenter: parent.horizontalCenter
source: parent.icon
}
Text {
anchors { top: myIcon.bottom; horizontalCenter: parent.horizontalCenter }
anchors {
top: myIcon.bottom
horizontalCenter: parent.horizontalCenter
}
text: parent.name
}
@ -47,7 +74,11 @@ Rectangle {
Component {
id: appHighlight
Rectangle { width: 80; height: 80; color: "lightsteelblue" }
Rectangle {
width: 80
height: 80
color: "lightsteelblue"
}
}
PathView {
@ -62,11 +93,30 @@ Rectangle {
path: Path {
startX: 10
startY: 50
PathAttribute { name: "iconScale"; value: 0.5 }
PathQuad { x: 200; y: 150; controlX: 50; controlY: 200 }
PathAttribute { name: "iconScale"; value: 1.0 }
PathQuad { x: 390; y: 50; controlX: 350; controlY: 200 }
PathAttribute { name: "iconScale"; value: 0.5 }
PathAttribute {
name: "iconScale"
value: 0.5
}
PathQuad {
x: 200
y: 150
controlX: 50
controlY: 200
}
PathAttribute {
name: "iconScale"
value: 1.0
}
PathQuad {
x: 390
y: 50
controlX: 350
controlY: 200
}
PathAttribute {
name: "iconScale"
value: 0.5
}
}
}
}