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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Методы (can) copy, paste и.т.п  (Прочитано 12394 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Апрель 12, 2018, 10:47 »

Добрый день

Задумал переделать одно место, работает, но уж очень коряво, и новый код плохо ложится. Банальная реакция на команду (часто из меню). Может, не мудрствуя лукаво, сделать так
Код
C++ (Qt)
struct CWinCommand {
bool CanCopy( QString * txt ) const = 0;   // можем копировать? и что (подсветка и текст меню)
bool DoCopy ( void  ) = 0;
 
bool CanPaste( QString * txt ) const = 0;
bool DoPaste ( const QVariant & ) = 0;
 
void CanDelete(...
...
};
 
Ну и долить этот интерфейс в 2 базовых класса множественным наследованием. Но как-то засомневался... Может лучше слотами/сигналами? Но каких-то аргументов в их пользу не нашел. Наоборот, нужно чтобы код текущих окон не компилился (abstract class). Предрассудки типа "множ наследование - зло" не рассматриваем. Что я еще мог упустить? Или еще как можно (без сигналов)?

Спасибо
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #1 : Апрель 12, 2018, 15:17 »

struct CWinCommand {
 bool Can(WhatEnum what, cost QString& desc) const = delete;   // можем что
 bool Do(WhatEnum what, cost QString& param = {}) = delete;
 };

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Апрель 12, 2018, 15:53 »

struct CWinCommand {
 bool Can(WhatEnum what, cost QString& desc) const = delete;   // можем что
 bool Do(WhatEnum what, cost QString& param = {}) = delete;
 };

?
В "can" методах строка заполняется (чтобы подставить ее в меню), поэтому по указателю. Ну а в целом это ничего нового не вносит, подробности оформления.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #3 : Апрель 12, 2018, 16:31 »

Не уверен, что это имеет отношение к паттерну "команда"...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 12, 2018, 17:31 »

Не уверен, что это имеет отношение к паттерну "команда"...
Ну слово "команда" можно употреблять и без всякой связи с паттернами  Улыбающийся Есть ли здесь (разумная) альтернатива простецкому "интерфейсу" ?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #5 : Апрель 12, 2018, 17:41 »

Не уверен, что это имеет отношение к паттерну "команда"...
Ну слово "команда" можно употреблять и без всякой связи с паттернами  Улыбающийся Есть ли здесь (разумная) альтернатива простецкому "интерфейсу" ?

Очевидно, что если ваш код будут читать другие, то не надо называть копируемые объекты Синглтонами, синглтоны - Фасадами и тп:)
Просто потому, что это создаёт путаницу - например, сразу появляется вопрос - а может, это всё таки команда и вы что-то недоговариваете?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #6 : Апрель 12, 2018, 17:47 »

Ну а так, можно например так - при смене фокуса поднимаемся по иерархии виджетов, кастим виджет к интерфейсу ICopyable { bool enabled() = 0; QString text() const; void trigger(); } и поджигаем нужные экшны если есть интерфейс и он enabled()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 12, 2018, 18:18 »

Ну а так, можно например так - при смене фокуса поднимаемся по иерархии виджетов, кастим виджет к интерфейсу ICopyable { bool enabled() = 0; QString text() const; void trigger(); } и поджигаем нужные экшны если есть интерфейс и он enabled()
Это Вы говорите о "синхронизации", т.е. как (или когда) напр метод "canXXX" получит управление. Для меню у меня все айтемы устанавливаются когда юзер тыкнул на меню (берем активное окно и парим copy, paste, delete и.т.п. - все что нужно в меню)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #8 : Апрель 12, 2018, 18:29 »

Ну а так, можно например так - при смене фокуса поднимаемся по иерархии виджетов, кастим виджет к интерфейсу ICopyable { bool enabled() = 0; QString text() const; void trigger(); } и поджигаем нужные экшны если есть интерфейс и он enabled()
Это Вы говорите о "синхронизации", т.е. как (или когда) напр метод "canXXX" получит управление. Для меню у меня все айтемы устанавливаются когда юзер тыкнул на меню (берем активное окно и парим copy, paste, delete и.т.п. - все что нужно в меню)

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

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 13, 2018, 09:07 »

Так у вас не совсем корректно будут работать шорткаты, ну да ладно.
Автоматом/пулеметом не будут, нужно перехватить QEvent::ShortcutOverride
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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