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

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

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

Сообщений: 11445


Просмотр профиля
« : Июль 02, 2017, 13:38 »

Добрый день

Простенькая задачка, но не удалось сделать "чисто" (пришлось прибегать к dynamic_cast).

Есть пункт меню "Select All" который должен срабатывать по стандартной комбинации Cmd+A (Ctl+A на Вындоуз). Если действие не имеет эффекта - этот пункт должен быть задизаблен. Ну вроде без проблем, сделал так
Код
C++ (Qt)
// virtual
bool MyBaseWindow::CanSelectAll( void ) const
{
// возвращает true если QLineEdit, QTreeWidget или еще что в фокусе
}
 
// virtual
void MyBaseWindow::DoSelectAll( void )
{
// применяет к текущему фокусу
}
Ну и зову эти методы когда обновляю меню. Но, как всегда, нашлось  маааленькое но мерзкое исключение. Для одного окна нужна доп возможность - если нажато Alt то должны выбираться все айтемы в дереве, иначе - только те кто не имеет флажка Locked. Необязательно что в фокусе будет дерево - другие контролы там тоже есть. Ну и если Alt нажат то надо в меню поменять текст "Select All + Locked". Как быстро развалилась моя стройная система из 2 виртуалов  Улыбающийся Наверное я что-то не так делаю?  Улыбающийся

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

Сообщений: 2679


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


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

а нельзя это сделать дополнительным пунктом меню?

Ctrl+A: "Select All except Locked"
Ctrl+Alt+A: "Select All + Locked"
Записан

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

а нельзя это сделать дополнительным пунктом меню?

Ctrl+A: "Select All except Locked"
Ctrl+Alt+A: "Select All + Locked"
Он имеет смысл только для одного окна, для десятков других никаких locked нет. Хотя в официальной доке apple (якобы) "не рекомендует" модифицировать меню по клавишам - это делают все, и Finder первый Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

Мне вот сама идея, честно говоря, не оч. понятна - если юзер зажал Альт, то изменить пункт меню...
Но какой смысл юзеру лезть в меню, зажав альт? Кто так делает? В винде по альту, например, меню пропадает (стандартное поведение).
Поэтому я бы все же 2 пункта сделал. Плюс еще статус-тип показал - поведение то нестандартное..
Записан

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Мне вот сама идея, честно говоря, не оч. понятна - если юзер зажал Альт, то изменить пункт меню...
Но какой смысл юзеру лезть в меню, зажав альт? Кто так делает?
На каждой платформе существует стандартная практика, и лучше ее придерживаться (а не велосипедить). Уверяю Вас что пользователь Мас сразу же облапает меню со всеми Cmd, Alt, Shift - и всеми их комбинациями. Я же не спрашиваю (и не выражаю неудовольствия) почему в линуксе надо чего-то долбить в командной строке - ну значит там так надо.

Поэтому я бы все же 2 пункта сделал. Плюс еще статус-тип показал - поведение то нестандартное..
На этой платформе меню одно и всегда вверху экрана. Когда приложение активируется - его меню замещает предыдущий меню бар. В рамках приложения этот бар один на все окна, поэтому его подстройка под активное окно неизбежна, своих меню баров окна иметь не должны.

Ну и вообще-то вопрос был о взаимодействии классов  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

Уверяю Вас что пользователь Мас сразу же облапает меню со всеми Cmd, Alt, Shift - и всеми их комбинациями.

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

А вообще в меню 99% населения мышом лазят, без альтов и шифтов Улыбающийся

По поводу структуры классов - я бы наоборот делал - пусть активное окно заполняет меню, а не наоборот. Т.е. окно - контроллер, меню - slave.
Записан

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Ну и что? Увидит 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% юзеров  Улыбающийся  

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

Сообщений: 4349



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

Да уж, "лаконично и изящно". Улыбающийся
А если плагинов 1000 штук, несчастный пользователь начнет получать неописуемые удовольствия, пытаясь найти нужный плагин в меню. Улыбающийся
« Последнее редактирование: Июль 05, 2017, 09:00 от Old » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


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

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

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 не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Нужен нормальный плагин-менеджер, где их можно включить-выключить, глянуть версии, описания и пр.
Ну так это то самое "окно ради кнопки About" о котором я говорил. Понты "плагин-менеджер" опускаем. Включить-выключить тоже за уши притянуто. Что осталось?

Вот у меня как то тоже "дружественность" макаки часто вызывала вопросы и не только...
С "макакой" аккуратнее пожалуйста - я же не употребляю выражений типа "вындозная срань" и.т.п. Улыбающийся Здесь просто "довлеет" накопленный опыт. типа
Цитировать
Учиться легко - переучиваться трудно
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Ну так это то самое "окно ради кнопки About" о котором я говорил. Понты "плагин-менеджер" опускаем. Включить-выключить тоже за уши притянуто. Что осталось?
Например, некоторые плагины можно настраивать. Добавим вход в меню с другой зажатой кнопкой? Улыбающийся

Включить-выключить тоже за уши притянуто.
Да ну ладно.
Если бы в том же QtCreatore не было возможности отключать плагины из командной строки, то его в некоторых случаях было бы невозможно запустить вовсе. Улыбающийся
А менеджер плагинов, с возможностью вкл/выкл, позволяет иметь разные решения для одних и тех же задач. На примере того же QtCreator, пользователь может выбирать какой бэкэнд будет использоваться для разбора кода, или пользователь может включить только используемые им системы сборки... Много может быть возможностей.
« Последнее редактирование: Июль 05, 2017, 11:22 от Old » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


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

Добрый день

Простенькая задачка, но не удалось сделать "чисто" (пришлось прибегать к dynamic_cast).

Есть пункт меню "Select All" который должен срабатывать по стандартной комбинации Cmd+A (Ctl+A на Вындоуз). Если действие не имеет эффекта - этот пункт должен быть задизаблен. Ну вроде без проблем, сделал так
Код
C++ (Qt)
// virtual
bool MyBaseWindow::CanSelectAll( void ) const
{
// возвращает true если QLineEdit, QTreeWidget или еще что в фокусе
}
 
// virtual
void MyBaseWindow::DoSelectAll( void )
{
// применяет к текущему фокусу
}
Ну и зову эти методы когда обновляю меню. Но, как всегда, нашлось  маааленькое но мерзкое исключение. Для одного окна нужна доп возможность - если нажато Alt то должны выбираться все айтемы в дереве, иначе - только те кто не имеет флажка Locked. Необязательно что в фокусе будет дерево - другие контролы там тоже есть. Ну и если Alt нажат то надо в меню поменять текст "Select All + Locked". Как быстро развалилась моя стройная система из 2 виртуалов  Улыбающийся Наверное я что-то не так делаю?  Улыбающийся

Спасибо

Ну вообще самое простое решение - в ваших виртуалах взять значение QGuiApplication::keyboardModifiers и проверить, зажат ли альт.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Ну вообще самое простое решение - в ваших виртуалах взять значение QGuiApplication::keyboardModifiers и проверить, зажат ли альт.
Злополучное окно-исключение проверило и вернуло true в CanSelectAll, а толку? Tекст в меню меняет не оно само, а вызывающий CanSelectAll. А когда меню открылось - Alt может быть и отпущен до выбора пункта.

"Вызываюший" у меня наследник QApplication. Все изменения в меню выполняются когда юзер нажал в меню бар. Полемика "а нужно ли их менять" беспердметна, по меньшей мере их надо enabled/disabled. Суетиться с этим до открытия меню (всякий раз на изменение данных) явно плохо. С шорткатами там тоже интересно - но то уже др тема.

Рассматривал такой вариант
Код
C++ (Qt)
bool MyBaseWindow::CanSelectAll( QString * txt ) const;
void MyBaseWindow::DoSelectAll( const QString & txt );
 
Ну типа окно может сказать какой текст в меню, а потом его же и использовать. Ну не знаю, как-то смотрится не очень...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


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

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

Можно вместо тупеля структурку передавать.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Можно вместо тупеля структурку передавать.
Можно добавить еще один метод:
Код
C++ (Qt)
QString itemName() const;
возвращающий строку для пункта меню.
« Последнее редактирование: Июль 05, 2017, 16:25 от Old » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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