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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]Авто-скролл в QListWidget  (Прочитано 7727 раз)
soiam
Гость
« : Июль 12, 2012, 14:35 »

Доброго времени суток.
Есть виджет, который нужно перенести в QListWidget с помощью drag-n-drop(вообщем, что-нибудь дропнуть в QListWidget). QListWidget содержит много объектов, так много что есть вертикальная полоса прокрутки. Как мне перенести виджет в ту часть списка, которая не видна?
Т.е. в идеале хочется так: тяну виджет на QListWidget, когда подхожу к нижней границе QListWidget, он скролится вниз, когда к верхней- вверх. Как сделать такой скролл?
Заранее благодарен в наводке на алгоритм
« Последнее редактирование: Июль 12, 2012, 17:33 от soiam » Записан
Bepec
Гость
« Ответ #1 : Июль 12, 2012, 14:52 »

Отслеживать мышку с дропом, если подошла на N пикселей к нижней/верхней границе, то двигать вверх/вниз с определённым промежутком времени.
Записан
soiam
Гость
« Ответ #2 : Июль 12, 2012, 15:35 »

Спасибо. Сделал так. Вверх скролл работает отлично. А вот вниз... Вниз он и раньше автоматически прокручивалось с очень большой скоростью за счет того, что после последнего видимого в списке QListWidgetItemа есть небольшая пустая полоска. И доведя туда курсор при drag-n-dropе происходит быстрая стандартная qt-шная прокрутка вниз всего списка.
Как это можно побороть?
Записан
Bepec
Гость
« Ответ #3 : Июль 12, 2012, 15:41 »

Ахз что у тебя там не так.

PS я лично не понял в чём проблема.
Записан
andrew.k
Гость
« Ответ #4 : Июль 12, 2012, 15:55 »

Прямо анекдот у вас.
Цитировать
- Ты куда идешь! В баню?!
- Да нет, в баню!
- А, я думал ты идешь в баню.

Аппрув:
Т.е. в идеале хочется так: тяну виджет на QListWidget, когда подхожу к нижней границе QListWidget, он скролится вниз, когда к верхней- вверх. Как сделать такой скролл?
Заранее благодарен в наводке на алгоритм
если подошла на N пикселей к нижней/верхней границе, то двигать вверх/вниз с определённым промежутком времени.
Спасибо.
Записан
andrew.k
Гость
« Ответ #5 : Июль 12, 2012, 15:58 »

Верес, предлагаю тебе новую подпись "Капитан Очевидность".
Или ник смени, это будет вообще тема!
Записан
soiam
Гость
« Ответ #6 : Июль 12, 2012, 16:01 »

Изначально до релизации предложенной вами методики скролла скролл вверх совсем не работал, а когда подводишь к месту, указанному эллипсом на картинке, QWidgetList осуществляет почти моментальный скролл  к концу списка(это его какая-то особенность наверное).
Я сделал отслеживание события драга над списком: если он вверху списка, то включается таймер с постепенным скроллом вверх(1 элемент в 500мс). Аналогично написал для нижней части списка. Но вот этот стандартный мгновенный скроллинг вниз списка мешает. Т.е. получается вверх прокрутка с фиксированной скоростью, а вниз - моментально. Для пользователя не очень хорошо. Не знаю, что делать... Можно ли его как-нибудь отключить?
« Последнее редактирование: Июль 12, 2012, 16:08 от soiam » Записан
soiam
Гость
« Ответ #7 : Июль 12, 2012, 16:23 »

Всё, разобрался. Виной всему setCurrentRow(). При драг-н-дропе я выделял элемент списка, над которым находился курсор. Когда выделяешь последний видимый без скролла элемент списка, qt автоматически делает прокрутку на 1 элемент вниз. Соответственно выделяется и новый элемент и так по кругу... Срабатывает практический моментальный скролл вниз.  Выделение пришлось пока что отключить...
Записан
Bepec
Гость
« Ответ #8 : Июль 12, 2012, 17:10 »

Хм. Веселая особенность, незнал.

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

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

to andrew.k - то, что видишь ты, необязательно очевидно для других. Видя проблему, иногда сложно оформить алгоритм в слова.
Записан
andrew.k
Гость
« Ответ #9 : Июль 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 - то, что видишь ты, необязательно очевидно для других. Видя проблему, иногда сложно оформить алгоритм в слова.

Надо не словом помогать, а делом.
« Последнее редактирование: Июль 12, 2012, 17:26 от andrew.k » Записан
soiam
Гость
« Ответ #10 : Июль 12, 2012, 17:33 »

andrew.k, спасибо! так работает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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