, . .
Model/View , , . , .
onResult(), , setModel .
, setModel . QWidget , , . docs. onResult , ( ). , .,.
, , , . ( , , ), , . , . , QObject ( ) , .
QAbstractTableModel. :

#include <QtWidgets>
#include <QtConcurrent>
#include <tuple>
class AsyncTableModel : public QAbstractTableModel{
Q_OBJECT
using RowsList = QList<std::tuple<QString, QString, QString> >;
RowsList m_rows;
QFutureWatcher<RowsList>* m_watcher;
public:
explicit AsyncTableModel(QObject* parent= nullptr):QAbstractTableModel(parent){
m_watcher = new QFutureWatcher<RowsList>(this);
connect(m_watcher, &QFutureWatcher<RowsList>::finished,
this, &AsyncTableModel::updateData);
QFuture<RowsList> future = QtConcurrent::run(&AsyncTableModel::retrieveData);
m_watcher->setFuture(future);
}
~AsyncTableModel() = default;
static RowsList retrieveData(){
QThread::sleep(2);
RowsList list;
for(int i=0; i<10; i++){
list.append(std::make_tuple(QString("A%0").arg(i),
QString("B%0").arg(i),
QString("C%0").arg(i)));
}
return list;
}
Q_SLOT void updateData(){
beginResetModel();
m_rows = m_watcher->future().result();
endResetModel();
}
int rowCount(const QModelIndex &parent) const {
if(parent.isValid()) return 0;
return m_rows.size();
}
int columnCount(const QModelIndex &parent) const {
if(parent.isValid()) return 0;
return 3;
}
QVariant data(const QModelIndex &index, int role) const {
QVariant value= QVariant();
switch(role){
case Qt::DisplayRole: case Qt::EditRole:
switch(index.column()){
case 0:
value= std::get<0>(m_rows[index.row()]);
break;
case 1:
value= std::get<1>(m_rows[index.row()]);
break;
case 2:
value= std::get<2>(m_rows[index.row()]);
}
break;
}
return value;
}
};
int main(int argc, char* argv[]){
QApplication a(argc, argv);
QTableView tv;
AsyncTableModel model;
tv.setModel(&model);
tv.show();
return a.exec();
}
#include "main.moc"
:
, , . , . - , API, QTcpSocket/QNetworkAccessManager, , .