QML TableView + QAbstractTableModel - 如何从 QML 编辑模型数据? [英] QML TableView + QAbstractTableModel - how edit model data from QML?

查看:133
本文介绍了QML TableView + QAbstractTableModel - 如何从 QML 编辑模型数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从 QAbstractTableModel 继承了 C++ 类,并覆盖了下一个函数:

I have C++ class inherited from QAbstractTableModel with next functions overriden:

virtual QHash<int, QByteArray> roleNames() const noexcept override;
virtual Qt::ItemFlags flags(const QModelIndex& index) const noexcept override;

virtual int rowCount(const QModelIndex& parent = QModelIndex()) const noexcept override;
virtual int columnCount(const QModelIndex& parent = QModelIndex()) const noexcept override;
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const noexcept override;

virtual bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()) noexcept override;
virtual bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()) noexcept override;
virtual bool setData(const QModelIndex& index, const QVariant& data, int role = Qt::EditRole) noexcept override;

model 有 3 列,第一个是只读的,最后一个是可编辑的,所以这是 flags() 方法的实现:

model has 3 columns, first is readonly, last is editable, so this is flags() method implementation:

Qt::ItemFlags ObjectInitialStateModel::flags(const QModelIndex& index) const noexcept
{
    if (index.column() == 0)
    {
        return Qt::ItemIsEnabled | Qt::ItemNeverHasChildren;
    }
    else
    {
        return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemNeverHasChildren;
    }
}

在 QML 部分模型显示正常,但我不知道如何在 TableView 中编辑 2 列和 3 列的模型数据.我尝试编写列委托:

In QML part model is displayed fine, but i have no idea how i can edit model data for 2 and 3 columns in TableView. I've tried to write column delegate:

Item {
    id: item
    state: "labelMode"

    Text {
        id: textLabel
        text: styleData.value
        anchors.fill: parent
        renderType: Text.NativeRendering
    }

    TextField {
        id: textField
        text: styleData.value
        anchors.fill: parent

        Keys.onEnterPressed: commit()
        Keys.onReturnPressed: commit()
        Keys.onEscapePressed: rollback()

        function commit() {
            item.state = "labelMode"
        }

        function rollback() {
            item.state = "labelMode"
        }
    }

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        onDoubleClicked: item.state = "editMode"
    }

    states: [
        State {
            name: "labelMode"
            PropertyChanges {
                target: textLabel
                visible: true
            }
            PropertyChanges {
                target: mouseArea
                visible: true
            }
            PropertyChanges {
                target: textField
                visible: false
            }
        },

        State {
            name: "editMode"
            PropertyChanges {
                target: textLabel
                visible: false
            }
            PropertyChanges {
                target: mouseArea
                visible: false
            }
            PropertyChanges {
                target: textField
                visible: true
                focus: true
            }
        }
    ]
}

但我不知道如何在 commit() 函数中正确地为模型设置新数据.或者可能有另一种正确的方法来在 QML 中使用可编辑的列和 C++ 模型实现表格?

but i don't know how to set new data to the model in commit() function correctly. Or may be there are another right way to implement table in QML with editable columns and C++ model?

推荐答案

我找到了一个解决方案:

I've found one solution:

  1. 向委托添加属性:

<小时>

property var cppModel

<小时>

  1. 在列定义中设置此属性:

<小时>

TableViewColumn {
    role: "u"
    title: qsTr("u(t)")
    width: initialStateTableView.width / 3
    delegate: EditableDelegate {
        cppModel: DataSetService.currentDataSet ? DataSetService.currentDataSet.initialStateModel : null
    }
}

<小时>

  1. 在 C++ 模型中实现新方法:

<小时>

Q_INVOKABLE bool setData(int row, int column, const QVariant& data) noexcept;

<小时>

调用默认的 setData 方法


which calls default setData method

  1. 并从委托中的 commit() 函数调用它:

<小时>

function commit() {
    cppModel.setData(styleData.row, styleData.column, text)
    item.state = "labelMode"
}

<小时>

但我认为这是大丑陋的黑客,如果有人知道更优雅的解决方案,请分享...


But i think this is big ugly hack and if anybody knows more elegant solution, please share it...

这篇关于QML TableView + QAbstractTableModel - 如何从 QML 编辑模型数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆