Russian Qt Forum

Qt => Вопросы новичков => Тема начата: __Heaven__ от Январь 14, 2012, 12:39



Название: Два диапазона значений в DoubleSpinBox
Отправлено: __Heaven__ от Январь 14, 2012, 12:39
Всем доброго времени суток.
Как известно в виджете DoubleSpinBox существует 2 свойства minimum и maximum, что позволяет установить допустимый диапазон вводимых значений.
Мне хотелось бы узнать, существует ли готовое решение, где было бы 2 таких диапазона.
К примеру: разрешить пользователю вводить числа от 0 до 1 и от 4 до 5.
Ну, а если такого решения не существует, то прошу оказать мне помощь в создании подобного компонента.  Только тут будет упрощение: мне нужен не диапазон, а дополнительное конкретное число.
К примеру: разрешить пользователю вводить число 0.5 и числа из диапазона от 4 до 5.
Всем заранее спасибо.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Bepec от Январь 14, 2012, 12:50
Валидатор посмотрите. Он проверяет валидность вводимых данных, так что должен учесть все ваши пожелания.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: __Heaven__ от Январь 14, 2012, 19:58
прошу прощения, где я могу это посмотреть. В свойствах компонента не нашёл.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Bepec от Январь 14, 2012, 20:26
QDoubleValidator в ассистенте поищите.
К сожалению, помочь вам в его установке/настройке не могу, ранее не пользовался.
Поиск по форуму я думаю поможет.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: __Heaven__ от Январь 15, 2012, 14:29
Мне кажется, что этот класс нужен для других целей... Как я понял, он проверяет на валидность введённых данных из текстовой строки с учётом локалей, минимума, максимума, ранга и типа данных. В моём случае из DoubleSpinBox'а я извлекаю число типа double. Я с лёгкостью могу его проверить на валидность при помощи оператора if. Так что QDoubleValidator это не совсем то, что мне нужно.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: kambala от Январь 15, 2012, 14:42
может лучше такое сделать через радиокнопки? одна - пользователь хочет конкретное число (оно известно я так понимаю), вторая - пользователь вводит число в спинбокс.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 15, 2012, 15:09
может лучше такое сделать через радиокнопки? одна - пользователь хочет конкретное число (оно известно я так понимаю), вторая - пользователь вводит число в спинбокс.
Да. Это сразу минус юзабилити.
Каким образом пользователь узнает о всех этих "допустимых" диапазонах просто взглянув на спинбокс?


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: __Heaven__ от Январь 15, 2012, 15:54
Нет. Это не вариант. Представьте, у меня на форме 10 спинбоксов, а для одного, для которого нужна модификация с вводом, стоит радиокнопка. Это не то, хоть и на много проще. Я же программу создаю не для личного использования. Будет не эстетично


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 15, 2012, 16:06
в этом и суть, что не для себя жлаешь.
не вариант это как раз делать  диапазоны.
допусти будет допустимые:
1..1000 и от 1000000.. 10001000
как я узнаю о существовании второго диапазона?
а потом захочешь сделать 3 таких диапазона или еще больше.
наверняка можно решить как-то еще раз радио кнопки не нравятся


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Bepec от Январь 15, 2012, 17:14
Ловишь сигнал изменения значения, проверяешь в своей функции на валидность (т.е. вхождение в пределы), меняешь значение на стандартное (0 к примеру) и выводишь тултип с обозначением пределов.

Простое решение ^^


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 15, 2012, 17:51
Ловишь сигнал изменения значения, проверяешь в своей функции на валидность (т.е. вхождение в пределы), меняешь значение на стандартное (0 к примеру) и выводишь тултип с обозначением пределов.

Простое решение ^^
Такой тултип достанет, т.к. для double ввод невалидных значений разрешен - они должны появляться в EditLine, иначе пользователю трудно ввести число. Др дело валидатор отсекает их прием. Обычно делают так:

- пользователь вводит, если "это число" (а не буква и др) то ввод отображается даже если число вне диапазона

- окно закрывается или фокус соскакивает с Edit или истекло время ожидания (напр 1 сек). Тогда проверяется на диапазон и если нет - модальный диалог с указанием что валидно (неплохо и предложить min/max/default)

Ну да, это конечно "не так просто"  :)


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Bepec от Январь 15, 2012, 17:59
Я и имел в виду, в момент установки значения. Обычно после потери фокуса происходит ;)

Хотя я бы сделать версий 5-6 с разными вариантами :) И потом сам бы пытался ввести ^^ Потому что теоретически может быть гуд, а на деле...


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 15, 2012, 18:53
это все чушь. пользователь должен видеть, что он может ввести.
а если для этого он должен сначала ввести что-то, получить отлуп узнать, что оказывается нужно было вводить.
надо пересмотреть подход.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Bepec от Январь 15, 2012, 19:05
Ещё бы узнать лучше, что хочет автор реализовать этими двумя диапазонами.
Мб подскажем лучшее решение?


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 15, 2012, 19:34
это все чушь.
Для форумчан с громким голосом разжевываю:

Пример: диапазон 100-200, текущее значение 150. Пользователь перевел фокус и вводит напр 120. Он нажал 1, текст в Edit был selected, ну значит 150 заменилось на 1. Это значение невалидно, но выскакивать с алертом/тултипом явно плохо


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 15, 2012, 20:41
че разжевывать?
ты сам перечитай первый пост, а не с середины.
человек хочет два диапазона в одном контроле.
понятно что рализовать это можно, я говорил, что это не дружественно.
как пользователь должен узнать, что можно вводить, а что нельзя не начав вводить?


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: popper от Январь 15, 2012, 23:36
Всем доброго времени суток.
Только тут будет упрощение: мне нужен не диапазон, а дополнительное конкретное число.
К примеру: разрешить пользователю вводить число 0.5 и числа из диапазона от 4 до 5.

Раз задача сводится только к дополнительному числу, а не диапазону, посмотри, может быть логика приложения может быть реализована с помощью QAbstractSpinBox::specialValueText


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: __Heaven__ от Январь 16, 2012, 07:15
andrew.k, пользователь знает, какие числа он может туда вводить, так как возле спина стоит подсказка.
popper, что-то я так и не понял, что это за есть такое QAbstractSpinBox и с чем его едят...


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Bepec от Январь 16, 2012, 09:39
Igors, а попробовать перехватить снятие фокуса, или же временной промежуток, как предлагали?



Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 10:11
andrew.k, пользователь знает, какие числа он может туда вводить, так как возле спина стоит подсказка.
Подсказка это хинт или лабел с надписью: сюда можно вводить либо 0.5 либо от 4 до 5?
А что это за магические числа? Любопытно.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: __Heaven__ от Январь 16, 2012, 12:19
Да. Это лэйбел, на котором написано, что содержание элемента в расплаве (0.003, 0.01-0.08)% от  массы расплава. вот, что это за магические числа. Я не знаю, как мне сделать эту дырку между 0.003 и 0.01. Конечно же можно было при выходе из окошка ввода заменять неверное число на верное, но при этом будет "обман" пользователя. Он может не заметить этого и расчёт пойдёт уже по другим процентам...


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: kambala от Январь 16, 2012, 12:44
сделай диапазоном сегмент [0.003, 0.08], после ввода проверяй на валидность если число попадает в интервал (0.003, 0.01): если значение плохое, то покажи месседжбокс с вариантами "поставить 0.003", "поставить 0.01" и "ввести другое самому".


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 12:52
Все равно не понимаю.
Содержание алкоголя в бутылке пива 8% - понимаю.
Содержание алкоголя в бутылке пива от 4-8% - понимаю.
Содержание алкоголя в бутылке пива (0.003, 0.01-0.08)% - не понимаю)

А вдруг я буду пользоваться твоей программой?)


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: popper от Январь 16, 2012, 14:00
Класс QDoubleSpinBox есть наследник класса QAbstractSpinBox, в котором определено свойство specialValueText. Посмотри справку про это свойство. Оно определяет, какой текст должен отображаться при достижении нижней границы допустимого диапазона спинбокса.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 15:05
Igors, а попробовать перехватить снятие фокуса, или же временной промежуток, как предлагали?
Перехватывать нет необходимости, у валидатора есть метод fixup который позовется при снятии фокуса (и при нажатии Enter). Задержка также легко реализуется внутри валидатора (возвращать Intermediate если время не истекло). А приложение принимает данные по editingFinished

Вообще "а как с 2 диапазонами" не имеет самостоятельного значения - все то же самое что и с одним. А попытки проинформировать пользователя еще до начала ввода - ну для этого нужно слишком много экранного места, которого как правило нет. Обычно стоит с десяток edit'ов, (в 1 или неск столбиков), из них 2-4 имеют проверку на диапазон - где там писать min/max? А тултип легко может оказаться навязчивым, диапазон будет быстро запомнен. Проще и лучше вывалиться с диалогом и там уже расписать все возможные значения - это прекрасно обобщается.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 15:49
проще, но не лучше.
Страшный сон пользователя - приложение, которое на каждый чих и клик вываливает по мессаджбоксу.
__________________
Вы согласны с этим?|
           [Ок]           |
---------------------


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 16:01
проще, но не лучше.
Страшный сон пользователя - приложение, которое на каждый чих и клик вываливает по мессаджбоксу.
Вот и обсуждается как "не на каждый".

сделай диапазоном сегмент [0.003, 0.08], после ввода проверяй на валидность если число попадает в интервал (0.003, 0.01): если значение плохое, то покажи месседжбокс с вариантами "поставить 0.003", "поставить 0.01" и "ввести другое самому".
Пользователь хочет ввести 0.005 (допустимое значение) и нажал первый ноль. Ваши действия?

Видимо когда тема становится длинной - отвечающие перестают ее читать ("не асилил" :))


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 16:53
Пользователь хочет ввести 0.005 (допустимое значение) и нажал первый ноль. Ваши действия?
Подсветить красненьким фоном строку ввода?
и не забыть отключить кнопочку Ok/Save/...


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 17:21
Я бы для этой ситуации примерно такое поведение реализовал.
И тогда не нужны никакие издевательские хинты.

Плюс конечно слайдер покрасивее сделал, чтобы все точки 0.003, 0.01 и 0.08 были отрисованы.
Можно еще графически отрисовать диапазон и отдельную точку, чтобы пользователь понимал, почему слайдер ведет себя так странно.
И тогда внутри спинбокса можно "править бал" валидаторами и чем хочешь.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 17:39
Пейнт-дизайн на коленке.
Что-то вроде такого.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 17:41
Подсветить красненьким фоном строку ввода?
и не забыть отключить кнопочку Ok/Save/...
Ну пользователь пока не сделал ничего плохого, он просто вводит цифра за цифрой, зачем же сразу "мигать лампочками"? :) Ну и подсветили, дальше что?  Найти [0.003, 0.08] "методом втыка" затруднительно, диалог все равно делать придется.

Вот кстати я набираю этот пост, работает проверка правописания. Набираю неверное слово - ничего пока не происходит. "Ушел" со слова каким-то образом (пробел или курсором) - оно подсветилось


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 17:44
Вот кстати я набираю этот пост, работает проверка правописания. Набираю неверное слово - ничего пока не происходит. "Ушел" со слова каким-то образом (пробел или курсором) - оно подсветилось
А диалог он тебе сам открывает, слова поменять предлагает?


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 17:52
Igors и BRE, как вам мой вариант интерфейса?)


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 18:03
Igors и BRE, как вам мой вариант интерфейса?)
Нормально. Визуально проще сориентироваться в происходящем, но размером он не мал. :)
По мне, так ToolTip с информацией будет достаточно.
Или подсвечивать строку с неверным значением другим цветом и показывать информационную строку (рядом с подсвеченной строкой или внизу диалога) с описанием проблемы и валидных диапазонов. Такая строка может быть одна - если проблем нет, то она пустая, если где-то проблемы, то с описанием первой и рекомендациями по исправлению. И Ok выключать.

За открывающиеся диалоги в процессе ввода значения, да еще и с каким нибудь громким "Бам"...  постараться запомнить фамилии девелоперов и никогда не устанавливать их программы, они вас ненавидят. :)


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 18:09
Igors и BRE, как вам мой вариант интерфейса?)
Нормально. Визуально проще сориентироваться в происходящем, но размером он не мал. :)
По мне, так ToolTip с информацией будет достаточно.

За открывающиеся диалоги в процессе ввода значения, да еще и с каким нибудь громким "Бам"...  постараться запомнить фамилии девелоперов и никогда не устанавливать их программы, они вас ненавидят. :)
Я не предлагал на редактирование значения отдельный диалог фигачить. размеры можно изменить.
Главное идея принципиально другая.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 19:31
А диалог он тебе сам открывает, слова поменять предлагает?
Так ведь "верное слово" неизвестно, значит нечего предлагать. А вот с цифровым значением - другое дело

Igors и BRE, как вам мой вариант интерфейса?)
Ну "Set Default" совсем не помешало бы. Если же 2 диапазона (первоисточник), то нужны еще опции. Часто просто не удастся все это вместить в "общее UI", даже средней насыщенности. Ничего плохого в отдельном диалоге нет, нужно только чтобы он не раздражал пользователя, это решаемо.

Типичный ход мысли заказчика: "Программа рассчитана не на человека с улицы а на того кто владеет вопросом и знает хотя бы порядок вводимых чисел. Поэтому просто напомните/поправьте если ввод ошибочен, а раздувать/расписывать здесь нечего"

Это нормальный подход и спорить с заказчиком здесь нечего, тем более доказывать что "Вы не понимаете! Согласно принципам human interface guideness".. и.т.п.  :)


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 19:44
Так ведь "верное слово" неизвестно, значит нечего предлагать. А вот с цифровым значением - другое дело
Что значит не известно, а если ты правую кнопку на подчеркнутом слове нажмешь, то он тебе правильные (по его мнению) варианты предложит. Так что он мог бы открыть диалог и предложить тебе выбрать варианты из списка или добавить слова в словарь или потренировать грамматику или ...
Но он это не делает. Значит тебе повезло и ты пользуешься программой, авторы которой тебя уважают. :)



Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 20:38
Так что он мог бы открыть диалог и предложить тебе выбрать варианты из списка или добавить слова в словарь или потренировать грамматику или ...
Но он это не делает.
Не делает потому что ситуация позволяет, здесь могу и сидеть с красным словом. А вот например немодальный диалог, пользователь ввел число и ушел. Что должно происходить? Требовать чтобы обязательно нажимал Enter - мол, тогда ввод закончен. Ну можно конечно, но это коряво. Нормально по истечении какого-то времени принять валидное значение (и возможно начать по нему что-то делать) или же выдвигаться с диалогом ошибки и (пространными) объяснениями.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 20:49
Требовать чтобы обязательно нажимал Enter - мол, тогда ввод закончен. Ну можно конечно, но это коряво. Нормально по истечении какого-то времени принять валидное значение (и возможно начать по нему что-то делать) или же выдвигаться с диалогом ошибки и (пространными) объяснениями.
Коряво? А начать что то делать самой, без ведома пользователя, что-то там приняв... А если пользователь цифру одну не успел вбить, а значение все равно получилось валидное, будет использовать его. :)
Программа что-то должна делать только по команде пользователя (кнопочку он должен нажать), а если что-то не готово, то эта кнопочка должна быть disable.



Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 21:29
Коряво? А начать что то делать самой, без ведома пользователя, что-то там приняв... А если пользователь цифру одну не успел вбить, а значение все равно получилось валидное, будет использовать его. :)
А у него было достаточно времени (отсчитывая с последнего нажатия). Ладно, допустим даже он нажал Enter или Tab, все равно отлуп на невалидное значение надо давать, все равно диалог есть. Тогда зачем возиться с подсветкой (что обычно не так уж просто)?

Программа что-то должна делать только по команде пользователя (кнопочку он должен нажать), а если что-то не готово, то эта кнопочка должна быть disable.
Допустим забыл/не знал  что [0.003, 0.08]. Ввел 1. Подсветилось красным, (ага, неверно), и кнопка Ok задизаблена (не готово). И что ему теперь делать? :) Так или иначе все сводится к диалогу ошибки


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: __Heaven__ от Январь 16, 2012, 21:30
andrew.k, классная идея :)
Ну, правда, я, всё-таки, решил поставить диапозон без дырки и, если пользователь вводит число, что находится в этой дырке, то ругаться либо при выходе из окошка ввода, либо при тыкании кнопки расчёта.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 21:35
andrew.k, классная идея :)
Ну, правда, я, всё-таки, решил поставить диапозон без дырки и, если пользователь вводит число, что находится в этой дырке, то ругаться либо при выходе из окошка ввода, либо при тыкании кнопки расчёта.
Реализовать подобный интерфейс совсем не сложно. Мне потребовалось 5 минут на эскиз. Довести до ума чуть.
Уж лучше тогда валидаторы с хинтом, чем так мучить пользователя.


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 21:42
Допустим забыл/не знал  что [0.003, 0.08]. Ввел 1. Подсветилось красным, (ага, неверно), и кнопка Ok задизаблена (не готово). И что ему теперь делать? :) Так или иначе все сводится к диалогу ошибки
А ты почитай чуть выше, я писал как можно информировать пользователя не открывая диалогов (что сильно отвлекает пользователей, а некоторых так просто злит). :)


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 22:15
А ты почитай чуть выше, я писал как можно информировать пользователя не открывая диалогов (что сильно отвлекает пользователей, а некоторых так просто злит). :)
Полагаю что имеется ввиду это

По мне, так ToolTip с информацией будет достаточно.
Или подсвечивать строку с неверным значением другим цветом и показывать информационную строку (рядом с подсвеченной строкой или внизу диалога) с описанием проблемы и валидных диапазонов. Такая строка может быть одна - если проблем нет, то она пустая, если где-то проблемы, то с описанием первой и рекомендациями по исправлению. И Ok выключать.
Разумно, но возможностей маловато, в строку много не вставишь. Напр красивый слайдер (что нарисовал Андрюша) - пролетает. Часто желательны кнопки Set (min/max/default) и.т.п. С Ок тоже непонятно - если он выкл, значит Enter не имеет эффекта. И как (по какому условию) тогда должен активироваться текст ошибки?


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 22:23
Напр красивый слайдер (что нарисовал Андрюша) - пролетает.
Как бэ он не нуждается в индикации ошибки, он для этого и делался.

Часто желательны кнопки Set (min/max/default) и.т.п.
Кому желательна?

С Ок тоже непонятно - если он выкл, значит Enter не имеет эффекта. И как (по какому условию) тогда должен активироваться текст ошибки?
По сигналу textChanged от редактора, проверили что ввели, если плохо, то подсветили редактор, написали ошибку в строку статуса, заблокировали Ok. А если все хорошо, то наоборот. :)


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: Igors от Январь 16, 2012, 22:37
По сигналу textChanged от редактора, проверили что ввели, если плохо, то подсветили редактор, написали ошибку в строку статуса, заблокировали Ok. А если все хорошо, то наоборот. :)
Так не получается, ввод может быть intermediate (еще не валид, но может им стать если юзер "добьет").

Забыл упомянуть что "время приема" - настраиваемый параметр и кого диалоги раздражают - может просто установить его, скажем, 1 сутки и работать по Enter

В общем, тема себя исчерпала, умолкаю


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: BRE от Январь 16, 2012, 22:57
Так не получается, ввод может быть intermediate (еще не валид, но может им стать если юзер "добьет").
Что не получается?

может просто установить его, скажем, 1 сутки и работать по Enter
Это должно быть значение по умолчанию.

В общем, тема себя исчерпала, умолкаю
+1


Название: Re: Два диапазона значений в DoubleSpinBox
Отправлено: andrew.k от Январь 16, 2012, 23:15
По сигналу textChanged от редактора, проверили что ввели, если плохо, то подсветили редактор, написали ошибку в строку статуса, заблокировали Ok. А если все хорошо, то наоборот. :)
У меня была подобная реализация, когда полей много, ты их заполняешь по очереди, потом жамкаешь ок или ентер и видишь, что он выключен, и сходу и не сообразишь в чем дело, выходом стала подсветка красным как раз и хинт с текстом ошибки в момент набора.
И все равно приходится думать, что это я не так сделал, но программа позволила это сделать, а теперь недовольна?
Я думаю, что интерфейс не должен позволять выполнять некорректные действия.
А позволять их выполнять, но запрещать двигаться дальше вводя пользователя в ступор результат лени разработчика.