gpt4 book ai didi

c++ - QAbstractTableModel编辑而不清除单元格中的先前数据

转载 作者:行者123 更新时间:2023-11-30 02:15:41 25 4
gpt4 key购买 nike

我创建了一个基于 QAbstractTableModel 的模型,允许用户编辑该模型中的数据。该模型显示在 QMainWindow 的 QTableView 中。到目前为止,在我的模型中,我能够使单元格可编辑,并在编辑完成后保存用户输入的任何内容。

问题在于,当用户开始编辑时,它会“清除”该单元格之前的内容。因此,例如,如果我只想更改单元格中字符串的拼写,则必须重新键入整个值。我希望在编辑时编辑器将从模型中已有的数据开始,而不是空的。

我该怎么做?

问题示例:

在我开始编辑单元格之前:

Before editing

当我开始编辑时,单元格是空的。我希望它以模型中已有的先前值作为星标:

Once editing begins

这是我的模型的一个最小示例。我的实际模型要大得多,并且使用结构而不是 QVariants 的二维数组来存储数据。

标题:

const int COLS= 2;
const int ROWS= 6;

class EditableTableModel : public QAbstractTableModel
{
Q_OBJECT

private:
QVariant tableData[ROWS][COLS];

public:
EditableTableModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;

signals:
void editCompleted(QString);

};

实现:

EditableTableModel::EditableTableModel(QObject *parent)
: QAbstractTableModel(parent)
{
}

int EditableTableModel::rowCount(const QModelIndex & /*parent*/) const
{
return ROWS;
}


int EditableTableModel::columnCount(const QModelIndex & /*parent*/) const
{
return COLS;
}


QVariant EditableTableModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
int col = index.column();

switch (role) {
case Qt::DisplayRole:
return tableData[row][col];
}

return QVariant();
}


bool EditableTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (role == Qt::EditRole) {
if (!checkIndex(index))
return false;

tableData[index.row()][index.column()] = value;
return true;

}
return false;
}


QVariant EditableTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("First Name");
case 1:
return QString("Last Name");
}
}
return QVariant();
}


Qt::ItemFlags EditableTableModel::flags(const QModelIndex &index) const
{
return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
}

最佳答案

应该在 data() 方法中为 Qt::EditRole 返回数据。以下应该有效:

QVariant EditableTableModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
int col = index.column();

switch (role) {
case Qt::DisplayRole:
case Qt::EditRole: // <-- add this line
return tableData[row][col];
}

return QVariant();
}

请注意,上面的 switch-case 使用了一个叫做 fallthrough 的东西, 这样 switch-case 将匹配 Qt::DisplayRoleQt::EditRole

关于c++ - QAbstractTableModel编辑而不清除单元格中的先前数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855284/

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