2017-09-25 96 views
3

刷卡多的项目在默认情况下SwipeDelegate允许刷卡多的项目,如下面的图片:禁止在SwipeDelegate

enter image description here

正如你所看到的,多刷卡项目同时打开,我想只有一个开放的项目一次意味着如果您打开项目#1,通过打开项目#2,项目#1应该关闭。我怎么能做到这一点?与SwipeDelegate一个ListView

示例代码:

ListView { 
    id: listView 
    anchors.fill: parent 

    delegate: SwipeDelegate { 
     id: delegate 

     text: modelData 
     width: parent.width 

     swipe.right: Rectangle { 
      width: parent.width 
      height: parent.height 

      Label { 
       text: qsTr("SOME ACTION BUTTON") 

       padding: 20 
       anchors.fill: parent 
      } 

     } 
    } 

    model: ListModel { 
     id: listModel 
     ListElement { text: "Lorem ipsum dolor sit amet" } 
     ListElement { text: "Curabitur sit amet risus" } 
     ListElement { text: "Suspendisse vehicula nisi" } 
     ListElement { text: "Mauris imperdiet libero" } 
     ListElement { text: "Sed vitae dui aliquet augue" } 
     ListElement { text: "Praesent in elit eu nulla" } 
     ListElement { text: "Etiam vitae magna" } 
     ListElement { text: "Pellentesque eget elit euismod" } 
     ListElement { text: "Nulla at enim porta" } 
     ListElement { text: "Fusce tincidunt odio" } 
     ListElement { text: "Ut non ex a ligula molestie" } 
     ListElement { text: "Nam vitae justo scelerisque" } 
     ListElement { text: "Vestibulum pulvinar tellus" } 
     ListElement { text: "Quisque dignissim leo sed gravida" } 
    } 


    ScrollIndicator.vertical: ScrollIndicator { } 
} 
+1

代码请。 [** help/MCVE **](/ help/mcve) – derM

+1

您能否提供[mcve] –

+1

@derM我添加了一个示例代码,代码是[this official example]的缩小版本(https:// doc。 qt.io/qt-5/qtquickcontrols2-swipetoremove-example.html) – Elsiete

回答

5

这是我会怎么做:

import QtQuick 2.9 
import QtQuick.Controls 2.3 
import QtGraphicalEffects 1.0 

ApplicationWindow { 
    id: window 
    width: 800 
    height: 600 
    visible: true 

    ListView { 
     id: listView 
     anchors.fill: parent 

     ButtonGroup { 
      buttons: listView.contentItem.children 
     } 

     delegate: SwipeDelegate { 
      id: delegate 

      checkable: true 
      text: modelData 
      width: parent.width 
      checked: swipe.complete 
      onCheckedChanged: if (!checked) swipe.close() 

      swipe.right: Rectangle { 
       width: parent.width 
       height: parent.height 
       color: "#666" 

       Label { 
        text: qsTr("SOME ACTION BUTTON") 
        color: "white" 
        leftPadding: 20 
        anchors.verticalCenter: parent.verticalCenter 
       } 
      } 
     } 

     model: ListModel { 
      id: listModel 
      ListElement { text: "Lorem ipsum dolor sit amet" } 
      ListElement { text: "Curabitur sit amet risus" } 
      ListElement { text: "Suspendisse vehicula nisi" } 
      ListElement { text: "Mauris imperdiet libero" } 
      ListElement { text: "Sed vitae dui aliquet augue" } 
      ListElement { text: "Praesent in elit eu nulla" } 
      ListElement { text: "Etiam vitae magna" } 
      ListElement { text: "Pellentesque eget elit euismod" } 
      ListElement { text: "Nulla at enim porta" } 
      ListElement { text: "Fusce tincidunt odio" } 
      ListElement { text: "Ut non ex a ligula molestie" } 
      ListElement { text: "Nam vitae justo scelerisque" } 
      ListElement { text: "Vestibulum pulvinar tellus" } 
      ListElement { text: "Quisque dignissim leo sed gravida" } 
     } 


     ScrollIndicator.vertical: ScrollIndicator { } 
    } 
} 

ButtonGroup确保只有一个 “按钮”(SwipeDelegateAbstractButton衍生)可一次检查。 SwipeDelegate没有视觉效果来表示检查状态,所以我们可以安全地使用它来跟踪哪一个应该打开。我们仍然需要关闭,虽然先前开放的委托,所以这也正是

onCheckedChanged: if (!checked) swipe.close() 

进来。

swipedelegate

+1

谢谢你,那真是太棒了 – Elsiete

+2

如果你想在拖动另一个时拖动当前的那个,你也可以'checked:swipe.position!== 0' – GrecKo

+1

@GrecKo你的解决方案不起作用,当项目#1开始打开,项目#2应该开始关闭,所以两个项目的位置同时改变,并导致某种不可预知的行为。 – Elsiete