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

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

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

Сообщений: 11445


Просмотр профиля
« : Ноябрь 21, 2013, 11:33 »

Добрый день

Есть простое окно имеющее:

- Текстовый редактор
- Панель сообщений (QTextEdit read-only)
- 7-8 кнопарей
- список QListWidget
- попапку "Режим"

Окно должно работать в 2 режимах (переключается попапкой):

- редактирование "проекта" (внутренних текстовых данных приложения)
- редактирование внешнего файла.

Сейчас сделано тупо через "if"ы (если установлен один режим - делаем это, иначе то). Получается не очень хорошо - if'ы ощутимо захламляют методы. Вот если бы это были 2 разных окна - все прекрасно укладывалось бы в простое наследование с виртуалами. Но окно должно быть одно. Какой паттерн (или др решение) Вы бы "порекомендовали"?  Улыбающийся

Спасибо
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 21, 2013, 12:51 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 21, 2013, 13:09 »

QStackWidget? Вполне вписывается.
Мне не нужно скрывать одни контролы и показывать другие (ну только зачистить список (его в 1 из режимов нет) и поменять тултипы на паре кнопок - и все). Неприятно что получается многовато кода типа такого:
Код
C++ (Qt)
void MyWindow::SlotRun( void )
{
if (mode() == mode_File) {
...
}
else {
...
}
}
 
И эти if'ы начинают расползаться и проникать во все щели...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Ноябрь 21, 2013, 17:49 »

Я бы делал примерно так:
Код
C++ (Qt)
class Mode
{
public:
   virtual void commandRun() = 0;
   virtual void command1() = 0;
   virtual void command2() = 0;
   virtual void command3() = 0;
};
 
class InternalFileMode : public Mode
{
public:
   virtual void commandRun();
   virtual void command1();
   virtual void command2();
   virtual void command3();
};
 
class ExternalFileMode : public Mode
{
public:
   virtual void commandRun();
   virtual void command1();
   virtual void command2();
   virtual void command3();
};
 
class MyWindow
{
public slots:
   void SlotRun()
   {
       m_currentMode->commandRun();
   }
 
private:
   QList<Mode*>    m_modes;
   Mode                *m_currentMode;
};
 

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 21, 2013, 19:55 »

Я бы делал примерно так:
Так да, но возникает страшный невдобняк - UI не принадлежит "пимплам", возникает тонна геттеров/сеттеров. Даже если плюнуть и объявить их friend'ами - все равно не очень.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Ноябрь 21, 2013, 19:59 »

Так да, но возникает страшный невдобняк - UI не принадлежит "пимплам", возникает тонна геттеров/сеттеров. Даже если плюнуть и объявить их friend'ами - все равно не очень.
Не надо геттеров/сеттеров и друзей. Сделайте контролы публичными. Кстати в Ui:: они и так объявлены публичными.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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