Russian Qt Forum
Ноябрь 26, 2024, 02:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: постраничное передвижение по QListWidget  (Прочитано 4351 раз)
qt_newer
Гость
« : Июль 29, 2014, 19:21 »

Есть QListWidget с большим количеством элементов, надо сделать постраничное перемещение по нему (размер этого виджета, количество строк в нем может меняться вместе с размером формы). Пробую разные варианты:

list->setCurrentRow(20);
QListWidgetItem* item = list->currentItem();
list->scrollToItem(item);

QScrollBar *vb = list->verticalScrollBar();
int oldValue = vb->value();
oldValue = oldValue + 40;
vb->setValue(oldValue);

Как это правильно сделать? Спасибо заранее всем ответившим!
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Июль 30, 2014, 16:03 »

scrollTo попробуйте
Записан
qt_newer
Гость
« Ответ #2 : Июль 30, 2014, 20:22 »

проблема с первым вариантом в том, что я не знаю, сколько у меня видимых айтемов в листе, и сооответственно, не могу предположить, на сколько строк перейти в этой строке:  list->setCurrentRow(20);
проблема со вторым вариантом примерно в том же- непонятно насколько двигать скроллбар при разных размерах листвиджета на разных устройствах
Записан
Bepec
Гость
« Ответ #3 : Июль 30, 2014, 21:49 »

Количество строк = размер виджета / размер одной строки
Записан
qt_newer
Гость
« Ответ #4 : Июль 31, 2014, 11:27 »

спасибо, но для новичков и это сложно Улыбающийся вот, откуда взять размер строки, sizehint не хочет возвращать правильное значение.
Пока получилось так:
    QScrollBar *hsb = list->horizontalScrollBar();
    int bar = 10;
    if (hsb->isVisible()) {
        bar += hsb->height();
    }

    QModelIndex firstIndex = list->indexAt(QPoint(0, 0));

    QModelIndex lastIndex = list->indexAt(QPoint(0, list->height() - bar));

    int first = firstIndex.row();
    int last = lastIndex.row();

    int row_count = last-first+1;
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 31, 2014, 11:51 »

        bar += hsb->height();
Это явно "не то", высота может сильно отличаться от размера области прокрутки. Должно быть более высокоуровневое решение. Если кликнули в свободную зону скроллера (не thumb и не стрелки) - он должен скроллить на страницу, или у Вас не так?
Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #6 : Июль 31, 2014, 12:03 »

При нажатии на клавиш PageDown, PageUp курсор соответственно перемещается постранично вверх и вниз.
внутри QListView при реакции на нажатия клавиш вызывается:
Код:
QModelIndex QListView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) [virtual protected]
может стоит посмотреть в этом направлении?
Записан
qt_newer
Гость
« Ответ #7 : Июль 31, 2014, 13:04 »

        bar += hsb->height();
Это явно "не то", высота может сильно отличаться от размера области прокрутки. Должно быть более высокоуровневое решение. Если кликнули в свободную зону скроллера (не thumb и не стрелки) - он должен скроллить на страницу, или у Вас не так?
здесь смысл в том, чтобы попасть в зону последнего элемента, край видимой области минус размер скролл-бара и минус 10 это там (в моих тестах по крайней мере Улыбающийся
Более грамотно, конечно, было бы использовать что-то, вроде, visualRect:
http://qt-project.org/faq/answer/how_can_i_get_hold_of_all_of_the_visible_items_in_my_qlistview

на десктопе так, но скролл нужен на полстраницы
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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