具有居中当前项的简单 PathView

Posted

技术标签:

【中文标题】具有居中当前项的简单 PathView【英文标题】:Simple PathView with centered Current Item 【发布时间】:2017-11-22 09:23:53 【问题描述】:

我刚刚开始使用 QML 进行编程,我需要用一些图像制作一个简单的 Carousel。我发现最简单的方法是使用 PathView。据我所知,我试图将我当前的项目放在视图的中心,但失败了。这是我完成的代码。

Rectangle 
    id: rectangle
    height: 200
    color: "#00000000"
    Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
    Layout.fillWidth: true

    PathView 
        id: carouselView
        anchors.fill: parent
        model: listModel

        delegate: Image 
            width: PathView.isCurrentItem ? 256 : 128
            height: PathView.isCurrentItem ? 256 : 128
            source: iconSource
        
        path: Path 
            startX: 0
            PathLine 
                x: 800
                y: 0
            
        
        Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
    


ListModel 
    id: listModel
    ListElement 
        iconSource: "qrc:///images/chair.svg"
    
    ListElement 
        iconSource: "qrc:///images/chair.svg"
    
    ListElement 
        iconSource: "qrc:///images/chair.svg"
    
    ListElement 
        iconSource: "qrc:///images/chair.svg"
    

想要的效果是一个简单的水平轮播,当前项目居中。 当前使用的版本:5.6

【问题讨论】:

【参考方案1】:

这是一个使用 PathView 的简单轮播示例:

import QtQuick 2.9
import QtQuick.Controls 2.2

ApplicationWindow 
    visible: true
    width: 640
    height: 640
    Component 
        id: delegate
        Item 
            width: 200; height: 200
            scale: PathView.iconScale
            opacity: PathView.iconOpacity
            z: PathView.iconOrder
            Image  anchors.fill: parent; source: modelData 
        
    

    PathView 
        id: view
        anchors.fill: parent
        anchors.bottomMargin: 150
        anchors.topMargin: 50
        pathItemCount: 7
        preferredHighlightBegin: 0.5                         //
        preferredHighlightEnd: 0.5                           // That should center the current item
        highlightRangeMode: PathView.StrictlyEnforceRange    //
        model:
            [
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            "http://placeimg.com/200/200/any?rand=" + Math.random(),
            ]
        delegate: delegate
        path: Path 
            startX: 0; startY: view.height/2
            PathAttribute  name: "iconScale"; value: 0.2 
            PathAttribute  name: "iconOpacity"; value: 10.2 
            PathAttribute  name: "iconOrder"; value: 0 
            PathLine x: view.width / 2; y: view.height/2 
            PathAttribute  name: "iconScale"; value: 1.2 
            PathAttribute  name: "iconOpacity"; value: 1 
            PathAttribute  name: "iconOrder"; value: 8 
            PathLine x: view.width; y: view.height/2 
        
    

当然,如果您真的想将当前项目放在视图的中心,您只需更改路径,即将起点移动到中心等。

【讨论】:

如果我移动起点(屏幕中间的 startX ),我的左侧没有任何图像,我想要那个。你的例子很好,但我想要我的 2D 旋转木马,而不是 3D。我怎样才能做到这一点? 你只需要改变你想要的路径。 我已经更改了示例,现在检查一下。 是的,现在它们都居中了。与我的示例相同的结果:所有图像都显示在一行上,但 currentItem (或选定的项目)不在中心,它总是在左边! 我已经阅读了文档,看起来我已经找到了解决方案。见我编辑的答案。

以上是关于具有居中当前项的简单 PathView的主要内容,如果未能解决你的问题,请参考以下文章

具有 CSS 的菜单项的透视焦点(将其他项变灰并突出显示当前项)

将 JSF dataTable 中组件的 id 设置为数组中当前项的值

如何使用 Mongoose 获取当前项的下一项和上一项

如何使用 Mongoose 获取当前项的下一项和上一项

当它们具有最大宽度时将 div 内容居中

Autolayout - 当一个视图具有动态高度时,在 UITableViewCell 中垂直居中两个视图