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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Spinners + undo  (Прочитано 6701 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 03, 2014, 14:00 »

Добрый день

Юзверь нажал спиннер и держит, соответствующий editText обновляется 3 раза в секунду. При этом требование - каждое изменение должно отображаться в UI немедленно (не ожидая отпускания мыши). А вот с точки зрения undo это одна операция, бесполезно/плохо накапливать сотни изменений одного параметра. Сейчас undo работает так же как если бы значение было введено вручную. Как это изменить для случая со спиннером?

Спасибо
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 03, 2014, 14:35 »

Cпиннер это как бы выпадающий список, нет? Не могу представить вашу ситуацию.

PS мб вы имеете в виду spinBox?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 03, 2014, 14:59 »

Cпиннер это как бы выпадающий список, нет? Не могу представить вашу ситуацию.

PS мб вы имеете в виду spinBox?
Спиннер выглядит как 2 маленькие стрелочки справа от редактируемого поля. В Qt это QSpinBox, но он мне не подошел, сделал свой - не суть, ф-ционал тот же.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Сентябрь 03, 2014, 15:03 »

так а в чем проблема? анду фреймворк позволет мержить изменения
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 04, 2014, 08:22 »

так а в чем проблема? анду фреймворк позволет мержить изменения
Он не используется, вместо этого Undo пишется в файл(ы) и объекты реально удаляются. А делать по их образцу мне не очень нравится. Пример из букваря
Код
C++ (Qt)
bool AppendText::mergeWith(const QUndoCommand *other)
{
   if (other->id() != id()) // make sure other is also an AppendText command
       return false;
   m_text += static_cast<const AppendText*>(other)->m_text;
   return true;
}
Ожидать уникальности id не приходится - в любом приложении масса редактируемых полей.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Сентябрь 04, 2014, 09:00 »

Ожидать уникальности id не приходится - в любом приложении масса редактируемых полей.
Если пользователь будет успевать выполнить 5 команд в секунду, то для переполнения 32 битного инта ему придется потратить примерно 27 лет. Не каждый парень справиться с такой работой. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 04, 2014, 09:10 »

Если пользователь будет успевать выполнить 5 команд в секунду, то для переполнения 32 битного инта ему придется потратить примерно 27 лет. Не каждый парень справиться с такой работой. Улыбающийся
Пример: при выборе айтема какие-то поля заполняются числами. Выбран др айтем - др числа. И куда мне здесь щемиться с тем уникальным id() ?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Сентябрь 04, 2014, 09:14 »

Пример: при выборе айтема какие-то поля заполняются числами. Выбран др айтем - др числа. И куда мне здесь щемиться с тем уникальным id() ?
Одно действие - одна undo-команда, а внутри она может хранить сколько угодно чисел.
Пользователь кликнул комбобокс, сохранили все числа из полей в команде для возможности redo, и установили новые числа.
Еще раз пользователь кликнул - сохранили в команде текущие, установили новые.

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Сентябрь 04, 2014, 11:54 »

Одно действие - одна undo-команда, а внутри она может хранить сколько угодно чисел.
Пользователь кликнул комбобокс, сохранили все числа из полей в команде для возможности redo, и установили новые числа.
Еще раз пользователь кликнул - сохранили в команде текущие, установили новые.



Да, это не трубы гнуть.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Сентябрь 04, 2014, 13:03 »

Одно действие - одна undo-команда, а внутри она может хранить сколько угодно чисел.
Пользователь кликнул комбобокс, сохранили все числа из полей в команде для возможности redo, и установили новые числа.
Еще раз пользователь кликнул - сохранили в команде текущие, установили новые.
Непонимающий Не понял такого сценария. Сам выбор из комбо никак undo не касается - ведь никакие данные не были изменены. А в момент изменения если хотим уникальное id - его придется конструировать типа связки айтем + поле.  Выглядит как-то мутно и сложно.

Да, это не трубы гнуть.
Да, там знание букваря никак не помогает Улыбающийся Впрочем и в данной теме тоже, скорее вредит. Почему напр не  так: заблокировать добавление в undo после первого изменения и разрешить его как только мышь отпущена?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Сентябрь 04, 2014, 13:15 »

Юзверь нажал спиннер и держит, соответствующий editText обновляется 3 раза в секунду.
Что такое "соответствующий editText" ?
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Сентябрь 04, 2014, 13:39 »

Что такое "соответствующий editText" ?
Аттач: юзер давит верхнюю стрелку, пока не отпустил будут последовательно появляться значения 34, 35. 36 ...(при шаге 1)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Сентябрь 04, 2014, 13:44 »

В Qt это QSpinBox, но он мне не подошел, сделал свой - не суть, ф-ционал тот же.
В Qt undo/redo в таких случаях выключено.
Кто мешает Вам сделать так же Непонимающий

И чем не устроил Qt-ишный вариант?
« Последнее редактирование: Сентябрь 04, 2014, 13:46 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Сентябрь 04, 2014, 14:55 »

В Qt undo/redo в таких случаях выключено.
Кто мешает Вам сделать так же Непонимающий
Как "так же"? (на какой пример/класс Вы ссылаетесь?)

И чем не устроил Qt-ишный вариант?
Тем что он не наследник QLineEdit. У меня везде используется свой виджет в который вставлен QLineEdit. Ну я туда же и спыннер добавил, теперь любое поле может его иметь. И еще мелочь: в Qt нет (или не нашел) возможности "ускориться"
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Сентябрь 04, 2014, 15:03 »

Как "так же"? (на какой пример/класс Вы ссылаетесь?)
Как в том же QAbstractSpinBox - undo/redo буфер меняется только при ручном изменении, а не при прямом по Up/Down, Wheel.

И еще мелочь: в Qt нет (или не нашел) возможности "ускориться"
Код
C++ (Qt)
QAbstractSpinBox::setAccelerated( true );

Кстати, а как Вы изменяете содержимое QLineEdit при нажатии на Up/Down?
Ведь его QLineEdit::setText() чистит undo/redo буфер:
Цитата: assistant
Setting this property clears the selection, clears the undo/redo history, moves the cursor to the end of the line and resets the modified property to false. The text is not validated when inserted with setText().
« Последнее редактирование: Сентябрь 04, 2014, 15:22 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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