如何在QML中实现一个带有详细信息的ListView

编程语言 2026-07-10

我想做一个细致的ListView(列表视图),而不是使用一个只有轮廓的扁平元素。我希望每个元素都包含大量细节,例如渐变、附加在这些元素上的额外矩形以增添光泽效果,但要么是我的知识不足,要么ListView无法做到这一点。如果真是这样,是否有办法让列能够通过箭头键滚动,并让元素切换到已选中的变体?

我想创建的菜单示意图:

我想创建的菜单示意图。

这是按我的详细设计创建单个元素的方式:渐变配色方案和附加线在被选中时会改变颜色,同时文本也会切换为粗体。请多多包涵,因为我是新手程序员。

        Rectangle {
            id: selection1
            width: 240
            height: 29
            gradient: Gradient {
                GradientStop {
                    position: 0
                    color: "#d9d9d9"
                }

                GradientStop {
                    position: 1
                    color: "#c2c2c2"
                }
                orientation: Gradient.Vertical
            }
            Rectangle {
                id: rectangle7
                x: 0
                y: 27
                width: 240
                height: 1
                color: "#708c8c8c"
            }

            Text {
                id: text3
                x: 8
                y: 5
                width: 164
                height: 19
                color: "#000000"
                text: "Selection 1"
                font.pixelSize: 13
                styleColor: "#000000"
                smooth: false
                renderType: Text.QtRendering
                font.weight: Font.Normal
                font.styleName: "SemiBold"
                font.family: "Open Sans"
                font.bold: false
                DesignEffect {
                    effects: [
                        DesignDropShadow {
                            offsetY: -1
                            blur: 0
                        }]
                }
            }
        }

解决方案

这正是 delegate 属性的用途。你为列表中每个项分配你想要使用的组件。你可以在代理中放置渐变,或放你想要的任何东西。为从列表模型中提取的任意数据添加所需的属性。文档中有一个简单的示例。文档

ListView {
    ...
    delegate: Rectangle {
        id: listItem

        // Add required properties that comes from the model
        required string label

        gradient: Gradient {
            GradientStop {
                position: 0
                color: "#d9d9d9"
            }

            GradientStop {
                position: 1
                color: "#c2c2c2"
            }
            orientation: Gradient.Vertical
        }

        Text {
            text: listItem.label
        }
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章