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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Автоматический контроль QSlider'ов  (Прочитано 7471 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Январь 22, 2011, 20:04 »

Всем привет. Задача в том, что имеется несколько QSlider'ов, но сумма всех values этих слайдеров всегда должна быть равна 100 (по аналогии 100%). Иначе говоря, двигая ползунок одного слайдера на увеличение, у других ползунки автоматически двигаются на уменьшение (там где это возможно конечно) и наоборот. Вроде как реализовал, но из-за того, что сигнал valueChanged(int) шлётся как-то нестабильно - чем быстрее двигать ползунок, тем реже шлётся - то сама затея наследования QSlider'a и уменьшение/увеличение значений у слайдеров, кроме текущего, в слоте на сигнал valueChanged(int) не возымела успеха (обход рекурсии соблюдён). Может быть есть какие-либо альтернативы (не QSlider) решения данного вопроса? Спасибо.
« Последнее редактирование: Январь 22, 2011, 20:06 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
dd
Гость
« Ответ #1 : Январь 22, 2011, 20:20 »

По отпускании мыша ведь вызвается последний valueChanged, который должен нормализовать состояния всех слайдеров.
В чтом тогда проблема?
Записан
merke
Гость
« Ответ #2 : Январь 22, 2011, 21:00 »

Вот накидал тебе примерчик, посмотри
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #3 : Январь 22, 2011, 21:08 »

Вот накидал тебе примерчик, посмотри
спасибо, но не всё так просто)

По отпускании мыша ведь вызвается последний valueChanged, который должен нормализовать состояния всех слайдеров.
В чтом тогда проблема?
Я уже когда создал тему подумал примерно также. Т.е. решил делить разницу между старым и новым значениями слайдера между всеми оставшимися слайдерами (всего у меня их от 4х и больше) с учётом их текущих values и доступностей на изменения. До этого просто добавлял/удалял единицу (не знал на тот момент что сигнал шлётся не на каждый шаг движения ползунка). Хотел тему удалить, но тут так почему-то нельзя.
« Последнее редактирование: Январь 22, 2011, 21:11 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
dd
Гость
« Ответ #4 : Январь 22, 2011, 21:15 »

А ты что, единицу добавлял / удалял чтоли? о_0
Конечно не будет работать.
Нужно по сигналу смотреть текущее значение двигаемого слайдера и на основе него менять остальные.
Тогда вообще проблемы нет.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Январь 22, 2011, 21:21 »

А ты что, единицу добавлял / удалял чтоли? о_0
Конечно не будет работать.
Вот именно что работало бы, если б сигнал слался каждый раз после изменения на величину, заданную через setSingleStep() - в моём случае setSingleStep(1) - как это должно было быть теоретически.
Записан

kubuntu/Win7/x64/NetBeans
Kolobok
Гость
« Ответ #6 : Январь 22, 2011, 21:25 »

Думаю, тут лучше использовать сигнал sliderMoved ( int value )
Записан
dd
Гость
« Ответ #7 : Январь 22, 2011, 21:30 »

>> Вот именно что работало бы, если б сигнал слался каждый раз после изменения на величину, заданную через setSingleStep()

Так делать нельзя ни вкоем случае.
Во-первых ни на одной системе это работать так не будет, во-вторых положение слайдера может меняться программно на любую величину.
При обработке сигнала valueChanged нужно обязательно смотреть текущее значение и вычисялть все на основе него.
Записан
Fess
Гость
« Ответ #8 : Январь 22, 2011, 22:16 »

Смотри, набросал то, что тебе нужно.
Работает корректно.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Январь 23, 2011, 00:40 »

Смотри, набросал то, что тебе нужно.
Работает корректно.

Да, действительно то, что я и искал. Я даже свой вариант (с перегрузкой QSlider'а) заменил на этот, т.к. удобнее. Предлагаю выложить в "готовые решения", потому как вещь полезная - контролирует фиксированную величину.
п.с. не понял только почему циклы с использованием итераторов построены так:
Код
C++ (Qt)
for(QMap<QSlider*,float>::iterator it = m_Sliders.begin(), itEnd = m_Sliders.end(); it != itEnd; it++) { ... }
 

а не просто
Код
C++ (Qt)
for (QMap<QSlider*,float>::iterator it = m_Sliders.begin(); it != m_Sliders.end(); ++it) {...}
 
« Последнее редактирование: Январь 23, 2011, 00:41 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
asvil
Гость
« Ответ #10 : Январь 23, 2011, 00:43 »

Qt-creator style programming. Я так понимаю компилятор не оптимизирует it != m_Sliders.end(), и вызов функции end происходит на каждой итерации цикла, чего впринципе не должно быть если m_Sliders в цикле не изменяется. Вообщем оптимизация делается вручную.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #11 : Январь 23, 2011, 00:44 »

Qt-creator style programming. Я так понимаю компилятор не оптимизирует it != m_Sliders.end(), и вызов функции end происходит на каждой итерации цикла, чего впринципе не должно быть если m_Sliders в цикле не изменяется. Вообщем оптимизация делается вручную.
понятно
« Последнее редактирование: Январь 23, 2011, 00:47 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #12 : Январь 23, 2011, 02:21 »

хотя замечено случайное бесконечное зацикливание, в моём случае 4 слайдера
Записан

kubuntu/Win7/x64/NetBeans
Fess
Гость
« Ответ #13 : Январь 23, 2011, 10:09 »

хотя замечено случайное бесконечное зацикливание, в моём случае 4 слайдера
Это чисто идея. Доводи "до ума".. Выкладывай куда хочешь.
Рад, что помогло.
Qt-creator style programming. Я так понимаю компилятор не оптимизирует it != m_Sliders.end(), и вызов функции end происходит на каждой итерации цикла, чего впринципе не должно быть если m_Sliders в цикле не изменяется. Вообщем оптимизация делается вручную.
Qt-creator - чисто IDE. Не думаю, что mingw/gcc не оптимизировали этот момент. Просто привычка, да и так надежнее Улыбающийся
Записан
asvil
Гость
« Ответ #14 : Январь 23, 2011, 10:38 »

Qt-Creator coding-style.qdoc
Для итераторов только для чтения Qt строго-настрого советует использовать constBegin/End().
« Последнее редактирование: Январь 23, 2011, 14:26 от Филоненко Михаил » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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