Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Ноябрь 21, 2013, 11:33



Название: Режимы редактирования
Отправлено: Igors от Ноябрь 21, 2013, 11:33
Добрый день

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

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

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

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

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

Спасибо


Название: Re: Режимы редактирования
Отправлено: Bepec от Ноябрь 21, 2013, 12:51
QStackWidget? Вполне вписывается.


Название: Re: Режимы редактирования
Отправлено: Igors от Ноябрь 21, 2013, 13:09
QStackWidget? Вполне вписывается.
Мне не нужно скрывать одни контролы и показывать другие (ну только зачистить список (его в 1 из режимов нет) и поменять тултипы на паре кнопок - и все). Неприятно что получается многовато кода типа такого:
Код
C++ (Qt)
void MyWindow::SlotRun( void )
{
if (mode() == mode_File) {
...
}
else {
...
}
}
 
И эти if'ы начинают расползаться и проникать во все щели...


Название: Re: Режимы редактирования
Отправлено: Old от Ноябрь 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. Количество режимов можно расширять, добавляя новые.


Название: Re: Режимы редактирования
Отправлено: Igors от Ноябрь 21, 2013, 19:55
Я бы делал примерно так:
Так да, но возникает страшный невдобняк - UI не принадлежит "пимплам", возникает тонна геттеров/сеттеров. Даже если плюнуть и объявить их friend'ами - все равно не очень.


Название: Re: Режимы редактирования
Отправлено: Old от Ноябрь 21, 2013, 19:59
Так да, но возникает страшный невдобняк - UI не принадлежит "пимплам", возникает тонна геттеров/сеттеров. Даже если плюнуть и объявить их friend'ами - все равно не очень.
Не надо геттеров/сеттеров и друзей. Сделайте контролы публичными. Кстати в Ui:: они и так объявлены публичными.