C++ (Qt)TableModel::TableModel(std::vector<std::pair<uint32_t, uint32_t>> *v_ , QObject *parent) : QAbstractTableModel(parent){ v = v_;} void TableModel::upDate(){ beginResetModel(); endResetModel();} QVariant TableModel::data(const QModelIndex &index, int role) const{ if(!index.isValid() || v->size() == 0){ return QVariant(); }else{ switch(role){ case Qt::DisplayRole: { switch(index.column()){ case 0 :{ return v->at(index.row()).first; } case 1:{ return v->at(index.row()).second; } default: return QVariant(); } } case Qt::TextAlignmentRole:{ return Qt::AlignCenter; } case Qt::FontRole: { QFont f; f.setFamily("monospace"); f.setStyleHint(QFont::Monospace); return f; } default: return QVariant(); } }}
C++ (Qt)class TableView : public QTableView {...public: int numberRows;} bool TableView::viewportEvent(QEvent *event){ if(event->type == QEvent::Paint){ int hrow = rowHeight(0); if(hrow > 0){ numberRows = viewport()->size().height() / hrow } else{ numberRows = 1; } return QTableView::viewportEvent(event); }
C++ (Qt) std::vector<std::pair<Key, Type>> Core::GetTableData(int pos, nrows){ std::vector<std::pair<Key, Type>> v = threadsafe_unordered_map.get_vecctor(); std::vector<std::pair<Key, Type>> res; for(int i = 0; i < nrows; ++i) { std::pair<Key, Type> p = v[pos + i]; res.push_back(p); } return res;}
C++ (Qt) class MainWindow : public QMainWindow{ private: std::vector<std::pair<Key, Type>> v; } MainWindow::MainWindow(...){ ... model = new TableModel(&v, this)} void MainWindow::UpDateTable(){ v = core.GetTableData(ui->verticalScroll->sliderPosition(), ui->tableView->numberRows); model->upDate(); //beginResetModel() endResetModel()}
C++ (Qt) class Widget : public QWidget{ ... private: std::vector<std::pair<Key, Type>> wgtvec; Table *model;} Widget::Widget(...) : ...{ model = new TableModel(&wgtvec);} void Widget::updateModel(){ //запрашиваем вектор с данными std::vector<std::pair<Key, Type>> v = threadsafe_unordered_map.getVector(); int cursz = v.size(); int prvsz = wgtvec.size(); int count = cursz- prvsz; if(count > 0){ wgtvec.swap(v); beginInsertRows( QModelIndex(), prvsz, cursz); endInsertRows(); } } else if(count == 0){ QRect viewportRect = tableView->viewport()->rect(); QModelIndex topLeft = tableView->indexAt(viewportRect.topLeft()); QModelIndex bottomRight = tableView->indexAt(viewportRect.bottomRight()); if(topLeft.isValid() && bottomRight.isValid()){ model->dataChanged(topLeft,bottomRight); } } }
C++ (Qt) beginInsertRows( QModelIndex(), prvsz, cursz); wgtvec.swap(v); endInsertRows();
C++ (Qt)std::mutex m;std::unordered_map<Key, std::shared_ptr<T>> map;std::deque<shared_ptr<T>> q;
C++ (Qt)class Model : public ...{private: std::vector<Type> store;} void Model::update(std::vector<Type> &fresh){ int prvsz = store.size(); int cursz = fresh.size(); beginInsertRows(QModelIndex(), prvsz, cursz); store.swap(fresh); endInsertRows();}
C++ (Qt)Widget::Widget(...) : ...{ model = new TableModel(..., this); sort = new SortFilterProxyModel(this); sort->setSourceModel(model); treeview = new TreeView(this); treeview->setModel(sort);}
C++ (Qt)void Widget::updateModel(){ int cursz = v.size(); int prvsz = wgtvec.size(); int count = cursz- prvsz; if(count > 0){ std::vector<Type> v = threadsafe_unordered_map.getVector(); model->update(v); } else if(count == 0){ QRect viewportRect = tableView->viewport()->rect(); QModelIndex topLeft = tableView->indexAt(viewportRect.topLeft()); QModelIndex bottomRight = tableView->indexAt(viewportRect.bottomRight()); if(topLeft.isValid() && bottomRight.isValid()){ model->dataChanged(topLeft,bottomRight); } } }
sort->dataChanged(...)
void Model::update(std::vector<Type> &fresh){ int prvsz = store.size(); int cursz = fresh.size(); beginInsertRows(QModelIndex(), prvsz, cursz); store.swap(fresh); endInsertRows();}