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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSlider рисование текущего значения  (Прочитано 5169 раз)
vintik
Гость
« : Март 29, 2013, 13:10 »

Господа, помогите плз!

В QSlider необходимо отображать его текущее значение над ползунком.
Как я вижу есть 2 способа:
1. Завести QLabel и двигать его по событию valueChanged(int)
2. Отрисовывать значение в paintEvent

Хотел бы разобраться со вторым случаем.
Делаю так
Код:
   void paintEvent(QPaintEvent *event)
   {
       int position = QStyle::sliderPositionFromValue(minimum(),
                                                      maximum(),
                                                      value(),
                                                      width());
       QDateTime dt;
       dt.setTime_t(value());

       QPainter painter(this);
       QFontMetrics fm(painter.font());

       painter.drawText(QRect(position, 0, fm.width(dt.toString("hh:mm:ss")), 20), dt.toString("hh:mm:ss"));
       QSlider::paintEvent(event);
   }

Получается примерно следующее


Пару проблем не могу решить.
1. Не понимаю как мне рисовать текущее значение, чтобы оно было чуточку выше ползунка (чтобы не перекрывалось)
2. Позиция (position) вычисляемая в коде не всегда в точности совпадает с позицией ползунка. Если ползунок в начале то position чуть левее ползунка.
   Если же ползунок в конце, то position переползает правее ползунка

     Спасибо
Записан
carrygun
Гость
« Ответ #1 : Март 29, 2013, 13:41 »

Может проще будет использовать QTooltip::showText()?
Записан
vintik
Гость
« Ответ #2 : Март 29, 2013, 13:43 »

Да, мне коллега уже посоветовал, но всё равно спасибо!
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Март 29, 2013, 13:49 »

вызывай сперва QSlider::paintEvent(event), а потом только свой код
Записан
vintik
Гость
« Ответ #4 : Март 29, 2013, 13:57 »

Тоже вариант, но тогда всё равно имеет место некоторое "перекрытие"


По-прежнему остаётся проблема с вычислением позиции отображаемого текста
Записан
BuRn
Гость
« Ответ #5 : Март 30, 2013, 08:07 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 30, 2013, 08:52 »

Подход с paintEvent выглядит "мелкотравчатым", меняйте уже отрисовку самого thnmb'а (через стиль или как)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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