Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: soiam от Июль 12, 2012, 14:35



Название: [Решено]Авто-скролл в QListWidget
Отправлено: soiam от Июль 12, 2012, 14:35
Доброго времени суток.
Есть виджет, который нужно перенести в QListWidget с помощью drag-n-drop(вообщем, что-нибудь дропнуть в QListWidget). QListWidget содержит много объектов, так много что есть вертикальная полоса прокрутки. Как мне перенести виджет в ту часть списка, которая не видна?
Т.е. в идеале хочется так: тяну виджет на QListWidget, когда подхожу к нижней границе QListWidget, он скролится вниз, когда к верхней- вверх. Как сделать такой скролл?
Заранее благодарен в наводке на алгоритм


Название: Re: Авто-скролл в QListWidget
Отправлено: Bepec от Июль 12, 2012, 14:52
Отслеживать мышку с дропом, если подошла на N пикселей к нижней/верхней границе, то двигать вверх/вниз с определённым промежутком времени.


Название: Re: Авто-скролл в QListWidget
Отправлено: soiam от Июль 12, 2012, 15:35
Спасибо. Сделал так. Вверх скролл работает отлично. А вот вниз... Вниз он и раньше автоматически прокручивалось с очень большой скоростью за счет того, что после последнего видимого в списке QListWidgetItemа есть небольшая пустая полоска. И доведя туда курсор при drag-n-dropе происходит быстрая стандартная qt-шная прокрутка вниз всего списка.
Как это можно побороть?


Название: Re: Авто-скролл в QListWidget
Отправлено: Bepec от Июль 12, 2012, 15:41
Ахз что у тебя там не так.

PS я лично не понял в чём проблема.


Название: Re: Авто-скролл в QListWidget
Отправлено: andrew.k от Июль 12, 2012, 15:55
Прямо анекдот у вас.
Цитировать
- Ты куда идешь! В баню?!
- Да нет, в баню!
- А, я думал ты идешь в баню.

Аппрув:
Т.е. в идеале хочется так: тяну виджет на QListWidget, когда подхожу к нижней границе QListWidget, он скролится вниз, когда к верхней- вверх. Как сделать такой скролл?
Заранее благодарен в наводке на алгоритм
если подошла на N пикселей к нижней/верхней границе, то двигать вверх/вниз с определённым промежутком времени.
Спасибо.


Название: Re: Авто-скролл в QListWidget
Отправлено: andrew.k от Июль 12, 2012, 15:58
Верес, предлагаю тебе новую подпись "Капитан Очевидность".
Или ник смени, это будет вообще тема!


Название: Re: Авто-скролл в QListWidget
Отправлено: soiam от Июль 12, 2012, 16:01
Изначально до релизации предложенной вами методики скролла скролл вверх совсем не работал, а когда подводишь к месту, указанному эллипсом на картинке, QWidgetList осуществляет почти моментальный скролл  к концу списка(это его какая-то особенность наверное).
(http://img13.imageshost.ru/img/2012/07/12/image_4ffecb76653fe.png) (http://imageshost.ru/)
Я сделал отслеживание события драга над списком: если он вверху списка, то включается таймер с постепенным скроллом вверх(1 элемент в 500мс). Аналогично написал для нижней части списка. Но вот этот стандартный мгновенный скроллинг вниз списка мешает. Т.е. получается вверх прокрутка с фиксированной скоростью, а вниз - моментально. Для пользователя не очень хорошо. Не знаю, что делать... Можно ли его как-нибудь отключить?


Название: Re: Авто-скролл в QListWidget
Отправлено: soiam от Июль 12, 2012, 16:23
Всё, разобрался. Виной всему setCurrentRow(). При драг-н-дропе я выделял элемент списка, над которым находился курсор. Когда выделяешь последний видимый без скролла элемент списка, qt автоматически делает прокрутку на 1 элемент вниз. Соответственно выделяется и новый элемент и так по кругу... Срабатывает практический моментальный скролл вниз.  Выделение пришлось пока что отключить...


Название: Re: Авто-скролл в QListWidget
Отправлено: Bepec от Июль 12, 2012, 17:10
Хм. Веселая особенность, незнал.

Пробуйте, смотрите - как вариант сделайте задержку с выделением элемента.

Тогда получится даже без отслеживания мыши скролл вниз.

to andrew.k - то, что видишь ты, необязательно очевидно для других. Видя проблему, иногда сложно оформить алгоритм в слова.


Название: Re: Авто-скролл в QListWidget
Отправлено: andrew.k от Июль 12, 2012, 17:24
Всё, разобрался. Виной всему setCurrentRow(). При драг-н-дропе я выделял элемент списка, над которым находился курсор. Когда выделяешь последний видимый без скролла элемент списка, qt автоматически делает прокрутку на 1 элемент вниз. Соответственно выделяется и новый элемент и так по кругу... Срабатывает практический моментальный скролл вниз.  Выделение пришлось пока что отключить...
Делай не setCurrentRow, а просто выделение. Это разные вещи.
Текущий элемент не обязательно будет выделен и наоборот. И вообще текущий и выделенный могут быть разными элементами.

Как-то так:

Код
C++ (Qt)
QTreeWidgetItem *target=treeWidget->itemAt(pos);
if(target)
{
 treeWidget->clearSelection();
 target->setSelected(true);
}

to andrew.k - то, что видишь ты, необязательно очевидно для других. Видя проблему, иногда сложно оформить алгоритм в слова.

Надо не словом помогать, а делом.


Название: Re: Авто-скролл в QListWidget
Отправлено: soiam от Июль 12, 2012, 17:33
andrew.k, спасибо! так работает