ДК
Джон КофиМамыр 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 не связанные. А я грешил на баг какой-то.

          Пікірлер

          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
          Кіріңіз немесе Тіркеліңіз
          OI
          • Ora Iro
          • Жел. 24, 2024, 6:38 Т.Ж.

          C++ - Тест 001. Первая программа и типы данных

          • Нәтиже:40ұпай,
          • Бағалау ұпайлары-8
          AD

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

          • Нәтиже:50ұпай,
          • Бағалау ұпайлары-4
          m
          • molni99
          • Қаз. 26, 2024, 1:37 Т.Ж.

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

          • Нәтиже:80ұпай,
          • Бағалау ұпайлары4
          Соңғы пікірлер
          ИМ
          Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
          Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          Evgenii Legotckoi
          Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
          A
          ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
          Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
          ИМ
          Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas5Шілде 5, 2024, 11:02 Т.Ж.
          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          Енді форумда талқылаңыз
          Evgenii Legotckoi
          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          t
          tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
          NSProject
          NSProjectМаусым 4, 2022, 3:49 Т.Ж.
          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
          9
          9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

          Бізді әлеуметтік желілерде бақылаңыз