gpt4 book ai didi

c++ - QML TableView + QAbstractTableModel - 如何从 QML 编辑模型数据?

转载 作者:行者123 更新时间:2023-11-30 02:42:12 33 4
gpt4 key购买 nike

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

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;

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

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 列的模型数据。我试过写专栏委托(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() 函数中正确地为模型设置新数据。或者可能有另一种正确的方法来在具有可编辑列和 C++ 模型的 QML 中实现表?

最佳答案

我找到了一个解决方案:

  1. 向委托(delegate)添加属性:

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方法

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

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

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

关于c++ - QML TableView + QAbstractTableModel - 如何从 QML 编辑模型数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332298/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com