ComboBox 禁用特定索引处的项目

ComboBox disable an item at a particular index

我在 qml 中有一个组合框作为 TableViewColummn,我将其定义如下:

import QtQuick 2.3
import QtQuick.Window 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4


ListModel {
    id: comboModel

    ListElement {
        text: ""
        Index: -1
        Dims: -1
    }
}


TableViewColumn {
    id: imageTypeList
    role: "ImageType"
    title: "Image Type"
    width: 100
    delegate: Rectangle {
        ComboBox {
            anchors.verticalCenter: parent.verticalCenter
            anchors.margins: 2
            model: comboModel
            onActivated : {
                console.log(comboModel.get(index).Index)
            }
        }
    }
}

我的问题是,是否可以 disable 组合框菜单项给定 ComboBox 中的项目索引。所以,我不想更改底层模型,但实际上只是禁用该项目并且不允许用户 select 它。

Is it possible to disable a ComboBox menu item ... and not allow the user to select it?

当然,这是可能的。

使用 Quick Controls 2 you need to create ComboBox delegate 这样做:

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.0

Window {
    visible: true
    width: 640
    height: 200
    title: qsTr("Let's disable some items in ComboBox")

    ComboBox {
        id: control
        currentIndex: 0
        anchors.centerIn: parent

        model: [
            { text: "Enabled item.", enabled: true },
            { text: "Supposed to be disabled. Can't click on it.", enabled: false},
            { text: "Last, but enabled item.", enabled: true}
        ]
        width: 500
        textRole: "text"

        delegate: ItemDelegate {
            width: control.width
            text: modelData.text
            font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
            highlighted: ListView.isCurrentItem
            enabled: modelData.enabled
        }
    }
}

如果您使用的是 Quick Controls 1,则应提供您自己的 ComboBox 组件实现。