0

我正在尝试向代理模型添加一列。

长话短说,我正在使用方法在重载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);
}

结果: 对于任何输入,列右侧已编辑行中的所有单元格都向左移动一个单元格。

在此处输入图像描述

我发现了什么:

  1. QSortFilterProxyModel::data在任何更改之前和之后显示不同的值。如果我禁用QSortFilterProxyModel::setData()它不会改变。但当然,它不设置数据。 setData()肯定会发出信号。
  2. 代表也换了。如果我在行移动后输入,它将正确插入到 SQL
  3. 当然,移位发生添加的列之后,而不是之前。

UPD 1:班次由 触发QTableView::commitData(editor);,因此一旦工作,该行就会用班次重绘。

UPD 2:我尝试在模型中添加一列,在我的情况下是QSqlRelationalTableModel.

    auto* model { new QSqlRelationalTableModel };

    model->setTable("table");
    model->select();
    model->insertColumn(0);

结果:相同,见图:

在此处输入图像描述

UPD 3:我尝试对底层做同样的事情QSqlRelationalTableModel,但事实证明是不成功的。完全一样的效果。

4

0 回答 0