Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Апрель 12, 2018, 10:47



Название: Методы (can) copy, paste и.т.п
Отправлено: Igors от Апрель 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). Предрассудки типа "множ наследование - зло" не рассматриваем. Что я еще мог упустить? Или еще как можно (без сигналов)?

Спасибо


Название: Re: Методы (can) copy, paste и.т.п
Отправлено: qate от Апрель 12, 2018, 15:17
struct CWinCommand {
 bool Can(WhatEnum what, cost QString& desc) const = delete;   // можем что
 bool Do(WhatEnum what, cost QString& param = {}) = delete;
 };

?


Название: Re: Методы (can) copy, paste и.т.п
Отправлено: Igors от Апрель 12, 2018, 15:53
struct CWinCommand {
 bool Can(WhatEnum what, cost QString& desc) const = delete;   // можем что
 bool Do(WhatEnum what, cost QString& param = {}) = delete;
 };

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


Название: Re: Методы (can) copy, paste и.т.п
Отправлено: Авварон от Апрель 12, 2018, 16:31
Не уверен, что это имеет отношение к паттерну "команда"...


Название: Re: Методы (can) copy, paste и.т.п
Отправлено: Igors от Апрель 12, 2018, 17:31
Не уверен, что это имеет отношение к паттерну "команда"...
Ну слово "команда" можно употреблять и без всякой связи с паттернами  :) Есть ли здесь (разумная) альтернатива простецкому "интерфейсу" ?


Название: Re: Методы (can) copy, paste и.т.п
Отправлено: Авварон от Апрель 12, 2018, 17:41
Не уверен, что это имеет отношение к паттерну "команда"...
Ну слово "команда" можно употреблять и без всякой связи с паттернами  :) Есть ли здесь (разумная) альтернатива простецкому "интерфейсу" ?

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


Название: Re: Методы (can) copy, paste и.т.п
Отправлено: Авварон от Апрель 12, 2018, 17:47
Ну а так, можно например так - при смене фокуса поднимаемся по иерархии виджетов, кастим виджет к интерфейсу ICopyable { bool enabled() = 0; QString text() const; void trigger(); } и поджигаем нужные экшны если есть интерфейс и он enabled()


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


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

Так у вас не совсем корректно будут работать шорткаты, ну да ладно.


Название: Re: Методы (can) copy, paste и.т.п
Отправлено: Igors от Апрель 13, 2018, 09:07
Так у вас не совсем корректно будут работать шорткаты, ну да ладно.
Автоматом/пулеметом не будут, нужно перехватить QEvent::ShortcutOverride