Disable autoscroll
Привет. Есть QTableView, когда обновляются данные от модели, verticalScroll меняет свое положение на самое верхнее. Как сделать так, чтобы скролл остался на том месте, на каком он был до обновления данных, если кол-во строк, конечно, позволяет?
Я пробовал делать так:
qDebug() << "maxBefore: " << ui->_samples->verticalScrollBar()->maximum(); const int sliderPos = ui->_samples->verticalScrollBar()->sliderPosition(); auto conn = std::make_shared<QMetaObject::Connection>(); *conn = connect(_samplesModel, &Models::SampleModel::rowsInserted, [&](){ QObject::disconnect(*conn); qDebug() << "maxAfter: " << ui->_samples->verticalScrollBar()->maximum(); ui->_samples->verticalScrollBar()->setSliderPosition(sliderPos); });
Проблема вся в том, что maxAfter всегда 0! и, поэтому, значение для позиции слайдера устанавливать смысла нет. Но в этот момент модель ведь уже имеет строки! Я уже всё перелопатил, не понимаю как решить пробелему. Нативного решения я так понимаю нет? Ставить какой-то таймер, ставищий паузу, пока этот скролл заимеет максимальное значение, конечно же, я не буду.
Если делать коннект на такой сигнал
connect(_samplesModel, &QAbstractSlider::valueChanged...)
то, несмотря на то, что сигнал об изменении позиции (на 0, тк скролл в самое верхнее положение встанет) был принят, maximum слайдера всё-равно 0, хотя, строк уже полно, чтобы слайдер имел несколько позиций. Прошу хотя бы подсказать направление решения проблемы. Я бы написал делегат, да не понимаю на какие эвенты смотреть.
Дополню: хотел решить проблему так- насильно ставить максимальное значение для скролла. Потратил время, чтобы вычислить примерный коэффициент соотношения строк\слайдов. Но, если я делаю установку максимального кол-ва слайдов, а потом программно ставлю скролл в нужный мне слайд, то выесняется, что метод установки макс значения слайдов тупо не отрабатывает. Все-равно максимум 0! а строк то уже много на вьюхе!
ui->_samples->verticalScrollBar()->setMaximum(maxSliders);
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Ora Iro
- Жел. 24, 2024, 6:38 Т.Ж.
C++ - Тест 001. Первая программа и типы данных
- Нәтиже:40ұпай,
- Бағалау ұпайлары-8
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
Добрый день
Сдаётся мне, что проблема совсем в другом месте, поскольку обычно скролл как раз остаётся на месте.
У модели есть такие методы beginInsertRows, endInsertRows, beginRemoveRows, endRemoveRows, которые обычно вызывают при вставке и удалении строк. В эти методы добавляют индекс, с которого начинается вставка/удалени, а также от и до какой строки делается вставка и удалени.
Эти методы служат для управления View, чтобы как раз не возникало таких проблем как у вас.
То есть вам надо модель данных допиливать. Она же у вас кастомная, не так ли?
Модель от общей TreeModel, а она в свою очередь от QAbstract. Вьюха тоже дважды абстрактная, если так можно выразиться. Мне кажется вы указали верный путь- смотреть в работу модели. Тк с другими моделями подобное нормально отрабатывает. А может и вью, из-за абстракций лагает, попробую и её поменять на обычную. Не приходило таких мыслей раньше.
Я так понимаю, речь идет о том, чтобы после обновления выделенная записб оставалась прежней, а не слетала на верхнюю. Тогда перед обновлением нужно запомнить индекс выделенной записи и после обновления стать на нее.
такие естественные решения все перепробовал.
Получилось вчера так:
у нас просто есть свой сигнал у общей модели dataReceived (отрабатывает после endInsertRows() и endResetModel() ), вот с ним всё заработало. Короче, это внутренние проблемы, никак с Qt не связанные. А я грешил на баг какой-то.