QAbstractTableModel 编辑而不清除单元格中的先前数据
Posted
技术标签:
【中文标题】QAbstractTableModel 编辑而不清除单元格中的先前数据【英文标题】:QAbstractTableModel editing without clearing previous data in cell 【发布时间】:2019-04-25 18:07:35 【问题描述】:我创建了一个基于 QAbstractTableModel 的模型,允许用户编辑该模型中的数据。模型显示在 QMainWindow 中的 QTableView 中。到目前为止,在我的模型中,我能够使单元格可编辑,并在编辑完成后保存用户输入的任何内容。
问题在于,当用户开始编辑时,它会“清除”该单元格以前的内容。因此,例如,如果我只想更改单元格中字符串的拼写,我必须重新输入整个值。我希望在编辑时编辑器将从模型中已有的数据开始,而不是空的。
我该怎么做?
问题示例:
在我开始编辑单元格之前:
当我开始编辑时,单元格是空的。我希望它以模型中已经存在的先前值作为星标:
这是我的模型的一个最小示例。我的实际模型要大得多,并且使用结构而不是 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);
【问题讨论】:
【参考方案1】:应在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::DisplayRole
和 Qt::EditRole
。
【讨论】:
以上是关于QAbstractTableModel 编辑而不清除单元格中的先前数据的主要内容,如果未能解决你的问题,请参考以下文章
从 QAbstractTableModel 类中访问视图和代理模型?
QAbstractTableModel:index() 与 createIndex()
QAbstractTableModel::header 数据和 QML TableView