Qt qml如何从ListView中只检查一个开关

Posted

技术标签:

【中文标题】Qt qml如何从ListView中只检查一个开关【英文标题】:Qt qml how to check only one switch from a ListView 【发布时间】:2020-02-04 13:47:33 【问题描述】:

我有一个显示语言和相应开关的 qml ListView,如下面的代码所示。最初选择英语。但是,使用此代码,我可以选择多种语言。我只想选择一种(当我选择一种语言时,其他语言会自动取消选择)。怎么做?

 ListView
    id: langlist
    clip: true

    model: ListModel 
        ListElement  selected:true; title: "English"
        ListElement  selected:false;title: "French"
        ListElement  selected:false;title: "German"
        ListElement  selected:false;title: "Italian"
    

    delegate: Rectangle
        id: langelement
        height: 70
        width: parent.width
        color: "transparent"
        Label
            anchors.left: langelement.left
            anchors.leftMargin: 30
            anchors.top : langelement.top
            anchors.topMargin: 30
            text: model.title
            font.family: "Lato"
            font.pixelSize: 30
            font.bold: false
            color: "#FFFFFF"
        

        Switch 
            id: control
            anchors.right: langelement.right
            anchors.rightMargin: 30
            anchors.top : langelement.top
            anchors.topMargin: 20
            checked: model.selected
        
    
 

【问题讨论】:

【参考方案1】:

我会说您应该为此使用 ComboBox,因为它用于选择单个项目。

如果你坚持使用 ListView,你可以这样做:

ListView
    id: langlist
    clip: true

    property int selectedIndex : 0

    model: ListModel 
        ListElement  selected:true; title: "English"
        ListElement  selected:false;title: "French"
        ListElement  selected:false;title: "German"
        ListElement  selected:false;title: "Italian"
    

    delegate: Rectangle
        id: langelement
        height: 70
        width: parent.width
        color: "transparent"
        Label
            anchors.left: langelement.left
            anchors.leftMargin: 30
            anchors.top : langelement.top
            anchors.topMargin: 30
            text: model.title
            font.family: "Lato"
            font.pixelSize: 30
            font.bold: false
            color: "#FFFFFF"
        

        Switch 
            id: control
            anchors.right: langelement.right
            anchors.rightMargin: 30
            anchors.top : langelement.top
            anchors.topMargin: 20
            checked: selectedIndex == index

            onToggled: selectedIndex = index
        
    
 

【讨论】:

它说“无效的属性名称“onToggled””。我正在使用 Qt 5.8.0 和 QtQuick.Controls 2.0 我正在按照设计模型创建应用程序。该模型不使用组合框,而是使用带有开关的语言名称。所以这就是我选择 ListView 的原因。 我已经通过 onPressed 更改了 onToggled。它仍然不起作用。当我检查它打开并直接关闭的开关时,尽管 selectedIndex 属性获取索引的新值。

以上是关于Qt qml如何从ListView中只检查一个开关的主要内容,如果未能解决你的问题,请参考以下文章

Qt ListView 不显示 C++ 模型内容

如何使 Qt Quick (QML) ListView 项目无法选择?

如何将对话框锚定到listview qt qml中的按钮

Qt/QML:在加载程序加载后访问 ListView 以跳转到特定项目/页面

如何外包 qml listview 委托

QT/QML:模型没有数据时如何显示消息