Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qt_newer от Июль 29, 2014, 19:21



Название: постраничное передвижение по QListWidget
Отправлено: 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);

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


Название: Re: постраничное передвижение по QListWidget
Отправлено: Fregloin от Июль 30, 2014, 16:03
scrollTo попробуйте


Название: Re: постраничное передвижение по QListWidget
Отправлено: qt_newer от Июль 30, 2014, 20:22
проблема с первым вариантом в том, что я не знаю, сколько у меня видимых айтемов в листе, и сооответственно, не могу предположить, на сколько строк перейти в этой строке:  list->setCurrentRow(20);
проблема со вторым вариантом примерно в том же- непонятно насколько двигать скроллбар при разных размерах листвиджета на разных устройствах


Название: Re: постраничное передвижение по QListWidget
Отправлено: Bepec от Июль 30, 2014, 21:49
Количество строк = размер виджета / размер одной строки


Название: Re: постраничное передвижение по QListWidget
Отправлено: qt_newer от Июль 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;


Название: Re: постраничное передвижение по QListWidget
Отправлено: Igors от Июль 31, 2014, 11:51
        bar += hsb->height();
Это явно "не то", высота может сильно отличаться от размера области прокрутки. Должно быть более высокоуровневое решение. Если кликнули в свободную зону скроллера (не thumb и не стрелки) - он должен скроллить на страницу, или у Вас не так?


Название: Re: постраничное передвижение по QListWidget
Отправлено: Johnik от Июль 31, 2014, 12:03
При нажатии на клавиш PageDown, PageUp курсор соответственно перемещается постранично вверх и вниз.
внутри QListView при реакции на нажатия клавиш вызывается:
Код:
QModelIndex QListView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) [virtual protected]
может стоит посмотреть в этом направлении?


Название: Re: постраничное передвижение по QListWidget
Отправлено: qt_newer от Июль 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

на десктопе так, но скролл нужен на полстраницы