crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Программный скроллинг виджета в QScrollArea
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
sbar Дата 12.8.2009, 21:41
  100%-ная точность мне и не нужна. QScrollBar::setValue отлично подходит под мои цели, еще раз спасибо :)
SABROG Дата 12.8.2009, 20:42
  Это не возможно сделать со 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, 20:11
  Нужно прокрутить виджет, лежащий в QScrollArea программно на заданные координаты.

QWidget::pos(int x, int y) не подходит, т.к. не скроллит, а именно меняет положение виджета.
К тому же, судя по необновляемым скроллбарам, QScrollArea не считает его прокрученным, поэтому после такого «скролла», при попытке покрутить через скроллбары, виджет встает на изначальное положение (что и неудивительно). (См. аттач).

QWidget::scroll(int dx, int dy) тоже не то. Оно скроллит на координаты, относительно текущей, а не относительно начала. (См. закомменченные строки 17 и 18 в testwidget.cpp)
Со скроллбарами та же проблема: QScrollArea думает что виджет никто не прокручивал.

Как правильно покрутить скроллбары на нужные координаты? QScrollArea::wheelEvent послать что ли, или более правильный способ есть?
Заранее благодарен.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 22:45