ДК
Джон Кофи25 мая 2020 г. 4:12

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
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

4
Evgenii Legotckoi
  • 25 мая 2020 г. 5:21

Добрый день
Сдаётся мне, что проблема совсем в другом месте, поскольку обычно скролл как раз остаётся на месте.

У модели есть такие методы beginInsertRows, endInsertRows, beginRemoveRows, endRemoveRows, которые обычно вызывают при вставке и удалении строк. В эти методы добавляют индекс, с которого начинается вставка/удалени, а также от и до какой строки делается вставка и удалени.

Эти методы служат для управления View, чтобы как раз не возникало таких проблем как у вас.

То есть вам надо модель данных допиливать. Она же у вас кастомная, не так ли?

    ДК
    • 25 мая 2020 г. 5:37

    Модель от общей TreeModel, а она в свою очередь от QAbstract. Вьюха тоже дважды абстрактная, если так можно выразиться. Мне кажется вы указали верный путь- смотреть в работу модели. Тк с другими моделями подобное нормально отрабатывает. А может и вью, из-за абстракций лагает, попробую и её поменять на обычную. Не приходило таких мыслей раньше.

      МЛ
      • 26 мая 2020 г. 2:44

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

        ДК
        • 26 мая 2020 г. 3:24
        • (ред.)

        такие естественные решения все перепробовал.
        Получилось вчера так:

        const int maximumScroll = ui->_samples->verticalScrollBar()->maximum();
        const int sliderPos     = ui->_samples->verticalScrollBar()->sliderPosition();
        auto conn = std::make_shared<QMetaObject::Connection>();
        *conn = connect(_samplesModel, &Models::SampleModel::dataReceived, [conn, this, sliderPos, maximumScroll](){
            QObject::disconnect(*conn);
            ui->_samples->verticalScrollBar()->setMaximum(maximumScroll);
            ui->_samples->verticalScrollBar()->setSliderPosition(sliderPos);
        });
        

        у нас просто есть свой сигнал у общей модели dataReceived (отрабатывает после endInsertRows() и endResetModel() ), вот с ним всё заработало. Короче, это внутренние проблемы, никак с Qt не связанные. А я грешил на баг какой-то.

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь
          AD

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:50баллов,
          • Очки рейтинга-4
          m
          • molni99
          • 26 октября 2024 г. 8:37

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:80баллов,
          • Очки рейтинга4
          m
          • molni99
          • 26 октября 2024 г. 8:29

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:20баллов,
          • Очки рейтинга-10
          Последние комментарии
          i
          innorwall14 ноября 2024 г. 19:42
          Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
          i
          innorwall14 ноября 2024 г. 17:09
          Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
          i
          innorwall14 ноября 2024 г. 12:05
          EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
          i
          innorwall14 ноября 2024 г. 12:00
          PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
          Сейчас обсуждают на форуме
          i
          innorwall14 ноября 2024 г. 11:39
          добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
          i
          innorwall11 ноября 2024 г. 18:55
          Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
          9
          9Anonim25 октября 2024 г. 16:10
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
          ИМ
          Игорь Максимов3 октября 2024 г. 11:05
          Реализация навигации по разделам Спасибо Евгений!

          Следите за нами в социальных сетях