Название: Два диапазона значений в 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 Подсветить красненьким фоном строку ввода? Ну пользователь пока не сделал ничего плохого, он просто вводит цифра за цифрой, зачем же сразу "мигать лампочками"? :) Ну и подсветили, дальше что? Найти [0.003, 0.08] "методом втыка" затруднительно, диалог все равно делать придется.и не забыть отключить кнопочку Ok/Save/... Вот кстати я набираю этот пост, работает проверка правописания. Набираю неверное слово - ничего пока не происходит. "Ушел" со слова каким-то образом (пробел или курсором) - оно подсветилось Название: 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 с информацией будет достаточно. Разумно, но возможностей маловато, в строку много не вставишь. Напр красивый слайдер (что нарисовал Андрюша) - пролетает. Часто желательны кнопки Set (min/max/default) и.т.п. С Ок тоже непонятно - если он выкл, значит Enter не имеет эффекта. И как (по какому условию) тогда должен активироваться текст ошибки?Или подсвечивать строку с неверным значением другим цветом и показывать информационную строку (рядом с подсвеченной строкой или внизу диалога) с описанием проблемы и валидных диапазонов. Такая строка может быть одна - если проблем нет, то она пустая, если где-то проблемы, то с описанием первой и рекомендациями по исправлению. И Ok выключать. Название: 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. А если все хорошо, то наоборот. :) У меня была подобная реализация, когда полей много, ты их заполняешь по очереди, потом жамкаешь ок или ентер и видишь, что он выключен, и сходу и не сообразишь в чем дело, выходом стала подсветка красным как раз и хинт с текстом ошибки в момент набора.И все равно приходится думать, что это я не так сделал, но программа позволила это сделать, а теперь недовольна? Я думаю, что интерфейс не должен позволять выполнять некорректные действия. А позволять их выполнять, но запрещать двигаться дальше вводя пользователя в ступор результат лени разработчика. |