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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QSlider PageStep  (Прочитано 9515 раз)
hormeek
Гость
« : Март 12, 2014, 23:26 »

Здравствуйте форумчане!
У меня вопрос про QSlider и page step, параметр такой который двигает handle в сторону нажатия. Хотелось бы двинуть handle прям в точку нажатия а не на значение pagestep в сторону нажатия. Знает кто как так сделать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Март 12, 2014, 23:35 »

setValue()/setSliderPosition()?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
hormeek
Гость
« Ответ #2 : Март 12, 2014, 23:47 »

а поточнее можно новичку?)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Март 13, 2014, 01:10 »

новичок не знает как методы вызывать или как документацией пользоваться? slider->setValue(666);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
hormeek
Гость
« Ответ #4 : Март 13, 2014, 14:56 »

Не, я вроде как все это умею, только чтобы задать значения этими методами нужно знать куда нажал пользователь, сигнала такого я не нашел.=(
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Март 13, 2014, 15:57 »

void QAbstractSlider::sliderPressed() [signal]
This signal is emitted when the user presses the slider with the mouse, or programmatically when setSliderDown(true) is called.

если не подойдет, то унаследуйся от QSlider и переопредели mousePressEvent. либо фильтр событий на слайдер поставь если наследоваться не хочешь.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
hormeek
Гость
« Ответ #6 : Март 13, 2014, 18:11 »

Спасибо, буду копать в этом направлении=)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 13, 2014, 20:45 »

void QAbstractSlider::sliderPressed() [signal]
This signal is emitted when the user presses the slider with the mouse, or programmatically when setSliderDown(true) is called.
Твк это может быть нажатие в thumb'e. Ладно, пусть др сигнал, не суть. Ну а дальше что? Нужно знать размер thimb'a (откуда?), сравнивать его с общим (без учета кнопок) и.т.д. - выглядит муторно. Когда-то замечал (правда для scrollbar'а) что если "нажать и держать" то thimb сам прибежит в эту точку. Может зарядить нули в setRepeatAction (вдруг прокатит на шару  Улыбающийся)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Март 13, 2014, 21:19 »

Спасибо, буду копать в этом направлении=)
Для определения значения слайдера по координате мыши можно воспользоваться:
int QStyle::sliderValueFromPosition ( int min, int max, int position, int span, bool upsideDown = false ) [static]
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Март 14, 2014, 11:59 »

Для определения значения слайдера по координате мыши можно воспользоваться:
int QStyle::sliderValueFromPosition ( int min, int max, int position, int span, bool upsideDown = false ) [static]
А откуда взять min/max (в тех же координатах что и мышь)? Они совсем не равны размеру слайдера. Может так:

- сделать installEventFilter, отловить mousePressed и там:
- отловить style()->subControlRect(SC_ScrollBarAddPage..)
- вычислить min/max через SC_ScrollBarGroove и span через SC_ScrollBarSlider

Хотелось бы чего-то попроще, но не вижу как

Edit: немного попутал, min/max - это значения слайдера, они известны. Вычислять надо position и span которые совсем не равны координатам мыши и виджета.
« Последнее редактирование: Март 14, 2014, 12:28 от Igors » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Март 14, 2014, 12:04 »

А откуда взять min/max (в тех же координатах что и мышь)?
Она (функция) сама все сделает, она специально для этого сделана.
« Последнее редактирование: Март 14, 2014, 12:07 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 14, 2014, 12:34 »

Прильнем к первоисточнику
Код
C++ (Qt)
int QSliderPrivate::pixelPosToRangeValue(int pos) const
{
   Q_Q(const QSlider);
   QStyleOptionSlider opt;
   q->initStyleOption(&opt);
   QRect gr = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, q);
   QRect sr = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, q);
   int sliderMin, sliderMax, sliderLength;
 
   if (orientation == Qt::Horizontal) {
       sliderLength = sr.width();
       sliderMin = gr.x();
       sliderMax = gr.right() - sliderLength + 1;
   } else {
       sliderLength = sr.height();
       sliderMin = gr.y();
       sliderMax = gr.bottom() - sliderLength + 1;
   }
   return QStyle::sliderValueFromPosition(minimum, maximum, pos - sliderMin,
                                          sliderMax - sliderMin, opt.upsideDown);
}
 
Для начала это передрать подставив вместо q сам виджет и вместо pos - x(y) мыши
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Март 14, 2014, 12:38 »

Для начала это передрать подставив вместо q сам виджет и вместо pos - x(y) мыши
Для чего?
span - это длина или высота слайдера в зависимости от ориентации.
position - смещение мыши от начала виджета.

Но если хочется скопировать, то можно. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Март 14, 2014, 12:50 »

Для чего?
span - это длина или высота слайдера в зависимости от ориентации.
position - смещение мыши от начала виджета.
Пример: длина слайдера rect().width() = 100, но ширина thumb'а (ползунка) = 20. Тогда span уже не 100 а 80. Кроме того слайдер может иметь прибамбасы которые делают размер groove меньше. С position то же самое. A QStyle::sliderValueFromPosition - это static ф-ция, значит ничего не знает о всех этих деталях.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Март 14, 2014, 12:56 »

Пример: длина слайдера rect().width() = 100, но ширина thumb'а (ползунка) = 20. Тогда span уже не 100 а 80.
Какая разница какая ширина ползунка? Пусть он будет хоть 50 из 100. Улыбающийся Если пользователь ткнул посередине, то центральная линия ползунка должна стать на эту позицию. Тем более никто не мешает получать их значения и корректировать параметры.

Кроме того слайдер может иметь прибамбасы которые делают размер groove меньше. С position то же самое.
Бла-бла-бла. Подмигивающий
« Последнее редактирование: Март 14, 2014, 13:04 от Old » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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