2016-08-26 3 views
1

Я создал QIdentityProxyModel, называемый proxymodel, который расширяет QSqlTableModel, называемый sourcemodel, добавляя 3 вычисленных столбца. Вычисляемые столбцы создаются путем перемещения исходной модели и хранения данных в списке, который отображается проксимоделем. Проксимодель отображается в TableView.Как получить все данные из qt-модели

Проблема заключается в том, что если я не взаимодействую с TableView, модели загружают только первые 256 регистров 5426, поэтому изначально я могу выполнять вычисления только на этих первых 256 строках.

Я хочу заполнить список расчетами в строке 5426. пожалуйста! помогите мне сделать это? Любые идеи были бы полезны

Проект написан на pyqt, поэтому будьте готовы ответить, как хотите!

ответ

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); 
    } 
}; 
+0

спасибо! –

Смежные вопросы