Russian Qt Forum
Сентября 15, 2025, 11:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
   Начало   Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
Страниц: 1 2 [3] 4 5 ... 10
 21 
 : Сентября 05, 2025, 16:41 
Автор demaker - Последний ответ от Авварон
Цитировать
Или кривовато???
я бы ожидал багов да=)
весь смысл QTableView в вертикальном хедере который позволяет менять высоту строк (а как следствие высоту всей вью и макс значение скроллбара)
Используй QTreeView с uniformRowHeights=true https://doc.qt.io/qt-6/qtreeview.html#uniformRowHeights-prop - так оно будет вычислять скроллбар как firstRowHeight*rowCount() а не суммировать в цикле.
Скорее всего тормоза у тебя не уйдут так потому что все равно чтобы посчитать высоту вьюпорта скроллбара надо просуммировать вертикальные хедеры

Цитировать
У меня используется мьюченный std::unordered_map ну чтобы threadsafe был и данные добавляются при этом формируется ключ, чтобы
если уже такие данные есть до мы просто их обновляем.
не вижу особо проблем - в модели у тебя все равно будет вектор/дек так как ты в какой-то момент захочешь сортировку по колонкам делать и менять содержимое элементов
надо только аккуратно держать в синке вектор с мапой
в целом можно избежать вставки в середину лайфхаком - всегда добавлять новое в конец (beginInsertRows) а потом пересортировывать (вызывая в просессе layoutAboutToBeChanged/layoutChanged)
Делать фулл reset не очень удобно на практике так как полностью перерисоывает вьюпорт, сбрасывает селекшн.
Вьюша же рисует только то что попадает во вьпорт и если ряды добавляются вне его то никаких перерисовок не будет

 22 
 : Сентября 05, 2025, 15:35 
Автор demaker - Последний ответ от demaker
Авварон
Такой вопрос)

Можно ли допустим взять ту же вьюху(QTableView) и выводить в ней столько записей сколько помещается на отображение при этом использовать свой вертикальный скролл бар
Код
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()
}
 

Или кривовато???

У меня используется мьюченный std::unordered_map ну чтобы threadsafe был и данные добавляются при этом формируется ключ, чтобы
если уже такие данные есть до мы просто их обновляем.

Поэтому при формирование вектора могут добавиться как в середину так и в начало и как использовать insert в таком случае я не понимаю?
Нужно как-то предварительно рассчитывать куда insert делать.



 23 
 : Сентября 05, 2025, 14:29 
Автор Авварон - Последний ответ от Авварон
Ну мы платим ветку

 24 
 : Сентября 05, 2025, 13:45 
Автор demaker - Последний ответ от Авварон
А, ну и вместо reset советую insert/remove rows

 25 
 : Сентября 05, 2025, 13:44 
Автор demaker - Последний ответ от Авварон
demaker
Попробуй использовать QTreeView он чуть проще (не позволяет ресайзить вертикальные хедеры + есть опция uniformRowHeight которая делает отрисовку за O(N) вместо O(N*N))
1500 это не очень большое количество, стандартные вьюги должны тянуть такое если поиграться с опциями. Если я правильно помню, они сносно тянут до 20к строк.
Если надо прямо много (больше 100к, максимально я рисовал 3 миллиона строк), то надо писать свою вьюху - внутри QTableView/QTreeView есть стейт рядов (вектор) который хранит высоту ряда и синхронизируется с моделью. Так как это вектор то его ресайзы занимают значительно время на вставке в середину. Соответственно в модели вместо вектора надо пользовать std::deque. Но опять же это применимо когда рядов хотя бы полмиллиона.

 26 
 : Сентября 05, 2025, 11:57 
Автор demaker - Последний ответ от demaker
Всем доброго времени суток!

Возникла проблема с отображением большого количества строк в QAbstractTableModel.
Прорисовка графики начинает подвисать, когда количество строк в таблице в районе 1500.

Данные берутся из std::unordered_map и затем заполняется std::vector<std::pair<KEY, TYPE>> v и закидывается в модель.

В модели переопределил методы data, flags, rows, columns.

Есть метод upDate(), так как когда вычитываем свежую порцию данных ,то хотим их обновить в модели(например по таймеру 500ms)

Код
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();
       }
   }
}
 

Хотелось бы узнать насколько корректны мои действия в плане обновления данных модели?
Нужно ли именно все данные подгружать в модель? Хочется подгружать именно ту область данных, которая на данный момент отображается на view))
Может есть другие механизмы более правильные?

Может мне стоит использовать canFetchMore, fetchMore?
Не получится ли при этом что добавлю в модель все 1500 строк и опять также графика вновь будет подвисать?

Спасибо!


 27 
 : Сентября 04, 2025, 17:58 
Автор Авварон - Последний ответ от __Heaven__
Народ за бабками идёт и не ваши эти деревья ворочать

 28 
 : Сентября 04, 2025, 15:40 
Автор Авварон - Последний ответ от Авварон
это потенциальные сеньоры?)

а перевернуть строку могут?

не, сеньоров нет вообще
джуны/мидлы
ну точнее как бывают чуваки с 20ю годами опыта но на сеньора не тянут
вообще что-то с рынком беда какая-то

 29 
 : Сентября 04, 2025, 12:43 
Автор Авварон - Последний ответ от kambala
это потенциальные сеньоры?)

а перевернуть строку могут?

 30 
 : Сентября 04, 2025, 01:15 
Автор Авварон - Последний ответ от Авварон
ни в глубину ни в ширину вообще ничего не могут=(

Страниц: 1 2 [3] 4 5 ... 10

Страница сгенерирована за 0.047 секунд. Запросов: 17.