как сделать QtQuick TableView / TreeView с гетерогенным делегатом, выбранным на основе значения поля - PullRequest
1 голос
/ 08 апреля 2020

Как сделать TableView или TreeView с делегатом ячейки, выбранным в соответствии со значением другой ячейки?

Идея состоит в том, чтобы создать редактор свойств, подобный следующему:

Screenshot

Я пробовал различные из перечисленных здесь подходов: https://doc.qt.io/qt-5/qml-qt-labs-qmlmodels-tablemodel.html

Однако DelegateChooser можно выбирать только на основе столбца или на основе roleValue , Ни один из них не будет работать для приведенного выше варианта использования.

Модель может выглядеть примерно так:

model: TableModel {
    TableModelColumn { display: "name" }
    TableModelColumn { display: "value" }
    rows: [
        {
            name: "Name",
            type: "string",
            value: "Alfred"
        },
        {
            name: "Amount",
            type: "float",
            value: 3.75
        },
        {
            name: "Enabled",
            type: "bool",
            value: true
        },
        {
            name: "Count",
            type: "int",
            value: 2
        },
        {
            name: "Color",
            type: "color",
            value: "#3300ff"
        }
    ]
}

, чтобы показать представление таблицы с двумя столбцами, где делегат во втором столбце выбирается в соответствии со значением type .

Даже при выборе роли name (что является неоптимальным решением, поскольку будет много свойств каждого типа, и каждый DelegateChoice должен соответствовать нескольким именам) не работает:

delegate: DelegateChooser {
    role: "name"
    DelegateChoice {
        roleValue: "Enabled"
        delegate: CheckBox {
            checked: model.display
            onToggled: model.display = checked
        }
    }
    DelegateChoice {
        roleValue: "Count"
        delegate: SpinBox {
            value: model.display
            onValueModified: model.display = value
        }
    }
    DelegateChoice {
        delegate: TextField {
            text: model.display
            selectByMouse: true
            implicitWidth: 140
            onAccepted: model.display = text
        }
    }
}
...