如何从qt模型

时间:2016-08-26 13:38:43

标签: python c++ qt model

我创建了一个名为proxymodel的QIdentityProxyModel,它通过添加3个计算列来扩展名为sourcemodel的QSqlTableModel。 计算的列是通过遍历源模型并将数据存储在由代理模型映射的列表中来完成的。 代理模型显示在TableView中。

我遇到的问题是,除非我与TableView进行交互,否则模型只会加载前54个总计的256个寄存器,所以最初我只能对前256行执行计算。

我希望用5426行的计算填写清单。 请!帮我完成这件事?任何想法都会有所帮助

该项目是用pyqt编写的,所以你可以随意回答!

1 个答案:

答案 0 :(得分:0)

SQL模型使用渐进式提取。源模型从true返回canFetchMore。视图调用fetchMore,然后通过从数据库中获取更多行来添加到源模型中 - 仅当视图需要它们时。

由于您的代理需要所有数据,因此它应在空闲时间(使用零持续时间计时器)在源模型上调用fetchMore。它还应该正确跟踪源插入更多行!

class MyProxy : public QIdentityProxyModel {
  Q_OBJECT
  QMetaObject::Connection m_onRowsInserted;
  ...
  /// Update the computed results based on data in rows first through last
  /// in the source model.
  void calculate(int first, int last);
  void onRowsInserted(const QModelIndex & parent, int first, int last) {
    calculate(int first, int last);
  }
  void onSourceModelChanged() {
    disconnect(m_onRowsInserted);
    m_onRowsInserted = connect(sourceModel(), &QAbstractItemModel::rowsInserted,
                               this, &MyProxy::onRowsInserted);
    fetch();
  }
  void fetch() {
    if (!sourceModel()->canFetchMore(QModelIndex{})) return;
    QTimer::singleShot(0, this, [this]{
      if (!sourceModel()->canFetchMore(QModelIndex{})) return;
      sourceModel()->fetchMore(QModelIndex{});
      fetch();
    });
  }
public:
  MyProxy(QObject * parent = nullptr) : QIdentityProxyModel{parent} {
    connect(this, &QAbstractProxyModel::sourceModelChanged,
            this, &MyProxy::onSourceModelChanged);
  }
};