ДК
Джон Кофи25. Mai 2020 04: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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

4
Evgenii Legotckoi
  • 25. Mai 2020 05:21

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

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

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

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

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

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

        ДК
        • 26. Mai 2020 03:24
        • (bearbeitet)

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

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

          Kommentare

          Nur autorisierte Benutzer können Kommentare posten.
          Bitte Anmelden oder Registrieren
          Letzte Kommentare
          A
          ALO1ZE19. Oktober 2024 18:19
          Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
          ИМ
          Игорь Максимов5. Oktober 2024 17:51
          Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas55. Juli 2024 21:02
          QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          k
          kmssr9. Februar 2024 05:43
          Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          Jetzt im Forum diskutieren
          J
          JacobFib17. Oktober 2024 13:27
          добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
          JW
          Jhon Wick2. Oktober 2024 01:52
          Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
          КГ
          Кирилл Гусарев27. September 2024 19:09
          Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
          F
          Fynjy22. Juli 2024 14:15
          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

          Folgen Sie uns in sozialen Netzwerken