Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: hormeek от Март 12, 2014, 23:26



Название: QSlider PageStep
Отправлено: hormeek от Март 12, 2014, 23:26
Здравствуйте форумчане!
У меня вопрос про QSlider и page step, параметр такой который двигает handle в сторону нажатия. Хотелось бы двинуть handle прям в точку нажатия а не на значение pagestep в сторону нажатия. Знает кто как так сделать?


Название: Re: QSlider PageStep
Отправлено: kambala от Март 12, 2014, 23:35
setValue()/setSliderPosition()?


Название: Re: QSlider PageStep
Отправлено: hormeek от Март 12, 2014, 23:47
а поточнее можно новичку?)


Название: Re: QSlider PageStep
Отправлено: kambala от Март 13, 2014, 01:10
новичок не знает как методы вызывать или как документацией пользоваться? slider->setValue(666);


Название: Re: QSlider PageStep
Отправлено: hormeek от Март 13, 2014, 14:56
Не, я вроде как все это умею, только чтобы задать значения этими методами нужно знать куда нажал пользователь, сигнала такого я не нашел.=(


Название: Re: QSlider PageStep
Отправлено: kambala от Март 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. либо фильтр событий на слайдер поставь если наследоваться не хочешь.


Название: Re: QSlider PageStep
Отправлено: hormeek от Март 13, 2014, 18:11
Спасибо, буду копать в этом направлении=)


Название: Re: QSlider PageStep
Отправлено: Igors от Март 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 (вдруг прокатит на шару  :))


Название: Re: QSlider PageStep
Отправлено: Old от Март 13, 2014, 21:19
Спасибо, буду копать в этом направлении=)
Для определения значения слайдера по координате мыши можно воспользоваться:
int QStyle::sliderValueFromPosition ( int min, int max, int position, int span, bool upsideDown = false ) [static]


Название: Re: QSlider PageStep
Отправлено: Igors от Март 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 которые совсем не равны координатам мыши и виджета.


Название: Re: QSlider PageStep
Отправлено: Old от Март 14, 2014, 12:04
А откуда взять min/max (в тех же координатах что и мышь)?
Она (функция) сама все сделает, она специально для этого сделана.


Название: Re: QSlider PageStep
Отправлено: Igors от Март 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) мыши


Название: Re: QSlider PageStep
Отправлено: Old от Март 14, 2014, 12:38
Для начала это передрать подставив вместо q сам виджет и вместо pos - x(y) мыши
Для чего?
span - это длина или высота слайдера в зависимости от ориентации.
position - смещение мыши от начала виджета.

Но если хочется скопировать, то можно. :)


Название: Re: QSlider PageStep
Отправлено: Igors от Март 14, 2014, 12:50
Для чего?
span - это длина или высота слайдера в зависимости от ориентации.
position - смещение мыши от начала виджета.
Пример: длина слайдера rect().width() = 100, но ширина thumb'а (ползунка) = 20. Тогда span уже не 100 а 80. Кроме того слайдер может иметь прибамбасы которые делают размер groove меньше. С position то же самое. A QStyle::sliderValueFromPosition - это static ф-ция, значит ничего не знает о всех этих деталях.


Название: Re: QSlider PageStep
Отправлено: Old от Март 14, 2014, 12:56
Пример: длина слайдера rect().width() = 100, но ширина thumb'а (ползунка) = 20. Тогда span уже не 100 а 80.
Какая разница какая ширина ползунка? Пусть он будет хоть 50 из 100. :) Если пользователь ткнул посередине, то центральная линия ползунка должна стать на эту позицию. Тем более никто не мешает получать их значения и корректировать параметры.

Кроме того слайдер может иметь прибамбасы которые делают размер groove меньше. С position то же самое.
Бла-бла-бла. ;)


Название: Re: QSlider PageStep
Отправлено: Igors от Март 14, 2014, 13:04
Какая разница какая ширина ползунка? Пусть он будет хоть 50 из 100. :) Если пользователь ткнул посередине, то центральная линия ползунка должна стать на эту позицию.
Вот тыкаю прямо в окне где пишу это сообщение - однако ж на середину не становится, а прокручивает на страницу

Бла-бла-бла. ;)
Как всегда, "знаток" теряет терпение и начинает хамить  :)


Название: Re: QSlider PageStep
Отправлено: Old от Март 14, 2014, 13:12
Вот тыкаю прямо в окне где пишу это сообщение - однако ж на середину не становится, а прокручивает на страницу
Куда вы тыкаете? Какие страницы?
ТС хочет сделать определенное поведение у своего кастомного виджета, я предложил посмотреть на функцию. Что не так? :)

Как всегда, "знаток" теряет терпение и начинает хамить  :)
А где я хамлю, я так же как и вы что-то придумываю, только мне это словами описывать лениво. :)
А вот вы уже сдержаться не можете? Переходите на личности. Ну да ладно, такие высказывания напыщенного незнайки кроме улыбки  ничего не вызывают. :)


Название: Re: QSlider PageStep
Отправлено: Igors от Март 14, 2014, 15:06
я предложил посмотреть на функцию. Что не так? :)
Вот это не так
span - это длина или высота слайдера в зависимости от ориентации.
position - смещение мыши от начала виджета.

Ну да ладно, такие высказывания напыщенного незнайки кроме улыбки  ничего не вызывают. :)
Где Вы усмотрели "напыщенность"? А вот ожидать что static метод сам учтет текущий стиль, мягко говоря, наивно. Но я же не взвиваюсь, а делаю вид что не заметил как всезнайка пролил соус на скатерть :)

Вы пожалуйста не нервничайте, обсуждаем, все могут ошибаться, это нормально


Название: Re: QSlider PageStep
Отправлено: Old от Март 14, 2014, 15:31
А вот ожидать что static метод сам учтет текущий стиль, мягко говоря, наивно.
Отчего же. Статический метод легко мог бы получать любые константы текущего стиля через QApplication::style().
То что он этого не делает, ну что же... ТС всегда сможет получить эти константы сам и скорректировать параметры.
Не спешите сразу писать, подумайте. :)

Но я же не взвиваюсь, а делаю вид что не заметил как всезнайка пролил соус на скатерть :)
Конечно, потому что не уверены в себе, скорее всего из-за "глубоких фундаментальных знаний". :)

Вы пожалуйста не нервничайте, обсуждаем, все могут ошибаться, это нормально
Я не нервничаю, и не вижу в чем я ошибся? :)


Название: Re: QSlider PageStep
Отправлено: Igors от Март 17, 2014, 14:18
А вот и мне пришлось решать ту же проблему. Нашел способ проще
Код
C++ (Qt)
int MyStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
 QStyleHintReturn *returnData) const
{
switch (hint) {
case SH_Slider_AbsoluteSetButtons:
return Qt::LeftButton;
}
return mDefaultStyle->styleHint(hint, option, widget, returnData);
}