07. Repeater.md

一、Repeater

  Repeater 是一个非常特别又非常好用的类,它用来创建多个基于 Item 的组件,扔给它的父(通常是定位器或布局管理器)来管理。Repeater 有三个属性,count 指示它 创建了多少个基于 Item 的对象model 指定 数据模型delegate待实例化的组件

  我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

  Repeater 对象会在自己实例化后一次性地创建由 model 属性决定的所有 Itemmodel 属性可以取下列值:

  • 数字:当 model 为数字时,指示 Repeater 创建特定数量的组件,此时在 delegate 组件内可以访问 index 属性。
  • 字符串列表:当使用字符串列表作为 model 时,Repeater 创建的 Item 数量由列表长度决定,在 delegate 内可以通过modelData 访问字符串对象。
  • 对象列表:使用对象列表作为 model 与使用字符串列表类似,只是 modelData 代表 model 中的对象。
  • ListModel 等常见的 modelmodel 也可以是 ListModel 或者 QAbstractItemModel 的派生类。此时在 delegate 内可以通过role-name 访问 model 内的数据。

【1】、model 为数字

  我们新建一个 template.py 文件。

import sys

from PySide6.QtWidgets import QApplication
from PySide6.QtQml import QQmlApplicationEngine

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    engine = QQmlApplicationEngine()                                            # 2.创建QML引擎对象
    engine.load("template.qml")                                                 # 3.加载QML文件
    sys.exit(app.exec())                                                        # 4.进入程序的主循环并通过exit()函数确保主循环安全结束

  我们新建一个 template.qml 文件。

import QtQuick.Window

// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {
    width: 800                                                                  // 窗口的宽度
    height: 600                                                                 // 窗口的高度
    visible: true                                                               // 显示窗口
    color: "lightgray"                                                          // 窗口的背景颜色

    // 定义一个Flow,用于流式布局
    Flow {
        width: parent.width                                                     // 宽度
        height: parent.height                                                   // 高度 
        anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的
        spacing: 100                                                            // 用于设置子元素之间的间隔

        // Repeater是一个用于根据模型(通常是列表或数组)动态生成一组子元素的有用工具
        Repeater{
            // 定义了数据源,通常是一个列表或数组。
            model: 18                                                           // 设置重复的次数
            // 定义了如何显示模型中的每个项目,它是一个包含要实例化的 QML 元素的组件。
            delegate: Rectangle {
                width: 100
                height: 100
                color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
            }
        }
    }
}

【2】、model 为字符串列表

  修改 template.qml 文件的内容。

import QtQuick.Window

// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {
    width: 800                                                                  // 窗口的宽度
    height: 600                                                                 // 窗口的高度
    visible: true                                                               // 显示窗口
    color: "lightgray"                                                          // 窗口的背景颜色

    // 定义一个Row,用于水平布局
    Row {
        anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的
        spacing: 100                                                            // 用于设置子元素之间的间隔

        // Repeater是一个用于根据模型(通常是列表或数组)动态生成一组子元素的有用工具
        Repeater{
            // 定义了数据源,通常是一个列表或数组。
            model: ["Hello", "Qt", "Quick"]
            // 定义了如何显示模型中的每个项目,它是一个包含要实例化的 QML 元素的组件。
            delegate: Text {
                font.pointSize: 32
                font.bold: true
                color: "#99CCFF"
                text: modelData
            }
        }
    }
}

【3】、model 为对象列表

  修改 template.qml 文件的内容。

import QtQuick.Window

// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {
    width: 800                                                                  // 窗口的宽度
    height: 600                                                                 // 窗口的高度
    visible: true                                                               // 显示窗口
    color: "lightgray"                                                          // 窗口的背景颜色

    // 定义一个Row,用于水平布局
    Column {
        anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的
        spacing: 10                                                             // 用于设置子元素之间的间隔

        // Repeater是一个用于根据模型(通常是列表或数组)动态生成一组子元素的有用工具
        Repeater{
            // 定义了数据源,通常是一个列表或数组。
            model: [
                {"name": "小樱", "age": 10},
                {"name": "美琴", "age": 14},
                {"name": "夏娜", "age": 15},
            ]
            
            // 定义了如何显示模型中的每个项目,它是一个包含要实例化的 QML 元素的组件。
            delegate: Row {
                spacing: 100                                                    // 用于设置子元素之间的间隔

                Text {
                    font.pointSize: 32
                    font.bold: true
                    color: "#99CCFF"
                    text: modelData.name
                }

                Text {
                    font.pointSize: 32
                    font.bold: true
                    color: "#99CCFF"
                    text: modelData.age
                }
            }
        }
    }
}

delegate 属性内将 modelData 作为对象使用,直接访问它的属性。

【4】、 model 为 ListModel

  修改 template.qml 文件的内容。

import QtQuick.Window

// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {
    width: 800                                                                  // 窗口的宽度
    height: 600                                                                 // 窗口的高度
    visible: true                                                               // 显示窗口
    color: "lightgray"                                                          // 窗口的背景颜色

    // 定义一个Row,用于水平布局
    Column {
        anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的
        spacing: 10                                                             // 用于设置子元素之间的间隔

        // Repeater是一个用于根据模型(通常是列表或数组)动态生成一组子元素的有用工具
        Repeater{
            // 定义了数据源,通常是一个列表或数组。
            model: ListModel {
                ListElement {name: "小樱"; age: 10}
                ListElement {name: "美琴"; age: 14}
                ListElement {name: "夏娜"; age: 15}
            }
            
            // 定义了如何显示模型中的每个项目,它是一个包含要实例化的 QML 元素的组件。
            delegate: Row {
                spacing: 100                                                    // 用于设置子元素之间的间隔

                Text {
                    font.pointSize: 32
                    font.bold: true
                    color: "#99CCFF"
                    text: name
                }

                Text {
                    font.pointSize: 32
                    font.bold: true
                    color: "#99CCFF"
                    text: age
                }
            }
        }
    }
}
posted @ 2025-10-05 20:34  星光映梦  阅读(30)  评论(0)    收藏  举报