Программный скроллинг виджета в QScrollArea, на заданные координаты |
Здравствуйте, гость ( Вход | Регистрация )
Программный скроллинг виджета в QScrollArea, на заданные координаты |
sbar |
12.8.2009, 20:11
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 2.3.2009 Пользователь №: 583 Спасибо сказали: 0 раз(а) Репутация: 0 |
Нужно прокрутить виджет, лежащий в QScrollArea программно на заданные координаты.
QWidget::pos(int x, int y) не подходит, т.к. не скроллит, а именно меняет положение виджета. К тому же, судя по необновляемым скроллбарам, QScrollArea не считает его прокрученным, поэтому после такого «скролла», при попытке покрутить через скроллбары, виджет встает на изначальное положение (что и неудивительно). (См. аттач). QWidget::scroll(int dx, int dy) тоже не то. Оно скроллит на координаты, относительно текущей, а не относительно начала. (См. закомменченные строки 17 и 18 в testwidget.cpp) Со скроллбарами та же проблема: QScrollArea думает что виджет никто не прокручивал. Как правильно покрутить скроллбары на нужные координаты? QScrollArea::wheelEvent послать что ли, или более правильный способ есть? Заранее благодарен.
Прикрепленные файлы
|
|
|
SABROG |
12.8.2009, 20:42
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Это не возможно сделать со 100%-ой точностью, т.к. скроллы сами по себе как QProgressBar, у тебя есть неизвестная высота/ширина виджета, которая характеризует 100%. У тебя есть pageStep() и singleStep(). Эти цифры ничего кроме как некоторой части от 100% ничего не означают. singleStep() == 1, это 1 процент от 100%. QScrollBar::value() - текущее положение. Если это 10, то это 10% от 100%. Чтобы понять какая это координата на виджете надо знать его ширину/высоту, чтобы понять сколько это 100%. Предположим надо понять куда надо передвинуть значение слайдера, чтобы оказаться на y=50. Если высота виджета 500, значит 100%=500. Значит 50==x. (100*50)/500=10-1=9% (отнимаем 1 потому, что minimum начинается с нуля, а не одного). Значит используем QScrollBar::setValue(9), если QScrollBar::maximum() == 99. Из-за возможной погрешности при делении возможно придется округлить получившееся значение в меньшую сторону, чтобы viewport() показал нужный кусок начиная чуть ранее и он не был бы обрезан сверху. А может все гораздо проще и это мои бредни
QScrollBar * QAbstractScrollArea::horizontalScrollBar () const QScrollBar * QAbstractScrollArea::verticalScrollBar () const |
|
|
sbar |
12.8.2009, 21:41
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 2.3.2009 Пользователь №: 583 Спасибо сказали: 0 раз(а) Репутация: 0 |
100%-ная точность мне и не нужна. QScrollBar::setValue отлично подходит под мои цели, еще раз спасибо
|
|
|
Текстовая версия | Сейчас: 13.1.2025, 22:00 |