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

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

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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #15 : Июль 05, 2017, 22:35 »

Я бы сделал так: само приложение ничего не знает про пункты меню.
Когда конкретное окно активируется, оно само добавляет в меню свои экшены (Select All etc).
Пока окно активно, оно имеет доступ к экшенам и может их модифицировать при необходимости.
При деактивации окна, оно подчищает экшены из меню.
Таким образом можно реализовать очень гибкое поведение.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #16 : Июль 06, 2017, 06:53 »

Я бы сделал так: само приложение ничего не знает про пункты меню.
Когда конкретное окно активируется, оно само добавляет в меню свои экшены (Select All etc).
Пока окно активно, оно имеет доступ к экшенам и может их модифицировать при необходимости.
При деактивации окна, оно подчищает экшены из меню.
Таким образом можно реализовать очень гибкое поведение.
IMHO, лучше все таки, что бы меню формировалось централизовано, например, главным окном приложения. А активное окно отдавало бы указатели на свои QAction, которыми и управляло самостоятельно (дизаблило, изменяло текст и т.д.). Тогда одни и те-же экшены можно было бы использовать при формировании менюбара, настройки тулбара, формировании контекстных меню.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Июль 06, 2017, 08:35 »

Да нет, вполне норм. Надо только методу переделать название на более логичное.
Код:
std::tuple<bool /*can select*/, QString /*text*/, QVariant /*hint*/> MyBaseWindow::selectionInfo() const;
void MyBaseWindow::DoSelectAll( const QVariant & hint );

Можно вместо тупеля структурку передавать.
Да, такого можно нагородить много. Но меня смущает что вся эта арматура заряжается на один-единственный частный случай с Select, Вряд ли тут будет какая-то движуха в течение неск лет. Зато в др айтемах она возможна (напр CanCopy, CanPaste и др) - там очень хорошо показать чего копируем/пастим

Я бы сделал так: само приложение ничего не знает про пункты меню.
Когда конкретное окно активируется, оно само добавляет в меню свои экшены (Select All etc).
Пока окно активно, оно имеет доступ к экшенам и может их модифицировать при необходимости.
При деактивации окна, оно подчищает экшены из меню.
Таким образом можно реализовать очень гибкое поведение.
Окно может всяко-разно менять текущие данные, напр тот же select, вот он был - и уже нет. Поэтому порешать все в момент активации окна не удается. А бегать всякий раз апдейтить меню - нереально. Да и действия могут быть перекрыты напр floating окном или вообще модальным диалогом. 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Июль 07, 2017, 05:56 »

Да, забыл напомнить: вызовы CanSelectAll и DoSelectAll разорваны по времени. Получить какие-то данные от CanSelectAll можно, но их придется где-то хранить, а главное - обеспечить их "релевантность". В моем варианте QString - текст самого пункта меню
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #19 : Июль 07, 2017, 08:22 »

Ну и что? Увидит 2 пункта выбора - чем это мешает? По крайней мере не надо будет ему додумывать, что "а тут же еще альт нада зажать..."

А вообще в меню 99% населения мышом лазят, без альтов и шифтов Улыбающийся
Ладно, толку все равно не будет (с ответом на изначальный вопрос), давайте покалякаем о принципах ГУЯ  Улыбающийся

Пример: в меню есть пункт Plugins в нем "Plugin 1", "Plugin 2"... "Plugin N"  (сколько нашли на диске). Юзер выбрал плагин из меню - он подключился. Возможно плагин открыл свое окно, но может и нет. Все хорошо. Но вот начинаются мелкие пакости: нужно не подключать плагин, а посмотреть его "About". Плагин имеет интерфейс типа GetInformation возвращающий строку описания, но об UI он может и ничего не знать. Понятно что то "About" нужно в году раз - но нужно.

Решение в духе Mac: открываем меню с зажатой клавишей, теперь уже там "About Plugin 1", "About Plugin 2"... "About Plugin N", выбираем, смотрим About. Лаконично и изящно.

Решение в духе Вындоуз.... а затрудняюсь указать Улыбающийся Придется наверное тащить "корову на баню" - делать отдельное окно в котором будет список плагинов (чтобы там иметь кнопку About) или вообще отказаться от размещения плагинов в меню. Зато мы точно знаем что делает 99% юзеров  Улыбающийся  

сморим на firefox, пункт меню дополнения и делаем так для всех платформ.
там список плагинов с кнопками управления.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Июль 07, 2017, 09:20 »

сморим на firefox, пункт меню дополнения и делаем так для всех платформ.
там список плагинов с кнопками управления.
Плагины всякие бывают, не всегда это что-то типа "службы". У меня это просто "объект" (напр сфера) который создается на ходу (а не грузится из файла). Юзер добавит его 5 раз - получит 5 новых сфер. Что ж он, 5 раз должен окно открыть? И включить-выключить никакого нет, удалит все созданные сферы, ну dll'ка и выгрузится.

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

Сообщений: 3257


Просмотр профиля
« Ответ #21 : Июль 07, 2017, 11:30 »

Окно может всяко-разно менять текущие данные, напр тот же select, вот он был - и уже нет. Поэтому порешать все в момент активации окна не удается. А бегать всякий раз апдейтить меню - нереально. Да и действия могут быть перекрыты напр floating окном или вообще модальным диалогом. 

Йа писал в свое время манагер экшнов. Вкратце, идея была такая - есть построенное меню в экшонами. Все экшоны имеют ид (например, "copy", "selectAll").
Некоторые виджеты имеют добавленные в них экшоны (QWidget::addAction). Если нам нужен функционал копипасты, добавляем в виджет 2 экшона "copy", "paste".
Далее, при смене фокуса пробегаемся от текущего виджета в фокусе в верх по дереву и соединяем экшоны из виджетов с экшонами в меню. Те экшоны, которые в меню остались без соединения "гасим" (дизейблим или прячем (setVisible(false)).
Ваш функционал реализуется следующим образом - пихаем в меню два экшона - "selectAll","selectAllAlt". И в виджет два экшона. При показе меню проверяем флажок что экшон "альтернативный" и прячем или показываем.
Но это много кода писать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июль 07, 2017, 12:44 »

Если нам нужен функционал копипасты, добавляем в виджет 2 экшона "copy", "paste"...
...И в виджет два экшона.
Ой нет, такой хоккей нам не нужен

Йа писал...
Цитировать
- Ванька!
- Я!
- Это ты костер развел?
- Я..
- Туши быстро, немцы увидят, прилетят
- Йа-Йа
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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