Russian Qt Forum
Июня 18, 2025, 23:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

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

Сообщений: 4747



Просмотр профиля 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

Сообщений: 4747



Просмотр профиля 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

Сообщений: 4747



Просмотр профиля 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.963 секунд. Запросов: 23.