我正在尝试向代理模型添加一列。
长话短说,我正在使用方法在重载setSourceModel
方法中添加一列QSortFilterProxyModel::insertColumn()
。
。H
class CompoundItemsTableModel : public QSortFilterProxyModel {
Q_OBJECT
public:
explicit CompoundItemsTableModel(QObject* parent = nullptr);
void setSourceModel(QAbstractItemModel* sourceModel) override;
}
.cpp
void CompoundItemsTableModel::setSourceModel(QAbstractItemModel* sourceModel)
{
QSortFilterProxyModel::setSourceModel(sourceModel);
beginInsertColumns(QModelIndex(), 3, 3);
QSortFilterProxyModel::insertColumn(3);
endInsertColumns();
}
然后我们在一个表中使用这个模型:
。H
class VisibleTable : public QTableView {
public:
explicit VisibleTable(QWidget* parent = nullptr);
.cpp
VisibleTable::VisibleTable(QWidget* parent)
: QTableView(parent)
{
auto* proxyModel = new Database::CompoundItemsTableModel(this);
proxyModel->setSourceModel(
Database::SqLiteModel::initializeModel());
setModel(proxyModel);
}
结果: 对于任何输入,列右侧已编辑行中的所有单元格都向左移动一个单元格。
我发现了什么:
QSortFilterProxyModel::data
在任何更改之前和之后显示不同的值。如果我禁用QSortFilterProxyModel::setData()
它不会改变。但当然,它不设置数据。setData()
肯定会发出信号。- 代表也换了。如果我在行移动后输入,它将正确插入到 SQL
- 当然,移位发生在添加的列之后,而不是之前。
UPD 1:班次由 触发QTableView::commitData(editor);
,因此一旦工作,该行就会用班次重绘。
UPD 2:我尝试在模型中添加一列,在我的情况下是QSqlRelationalTableModel
.
auto* model { new QSqlRelationalTableModel };
model->setTable("table");
model->select();
model->insertColumn(0);
结果:相同,见图:
UPD 3:我尝试对底层做同样的事情QSqlRelationalTableModel
,但事实证明是不成功的。完全一样的效果。