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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [4.2.2] Разделение обработки событий формы  (Прочитано 3429 раз)
Mindtraveller
Гость
« : Май 30, 2007, 16:37 »

Приветствую.

Пишу программу, сотояющую из одной формы.
Компилятор MSVC 6. Интеграции в среду нет, все утилиты вызываю руками.

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

Итак, передо мной встала вполне логичная задача: разнести обработку разных частей (контролов на разных закладках) формы по нескольким классам. Каждый класс обрабатывает закладку формы.

Я решил сделать это при помощи наследования.
Основной класс - обработчик формы, наследуется от двух классов, каждый из которых обрабатывает свою закладку:


Код:
//---------------------------------------------------------
//EdUI.h
class EdUI
: public ObjUI,
 public TexUI,
 public virtual QDialog,
 public virtual Ui::Dialog
{
Q_OBJECT
public:
void Init() { TexUI::Init(); ObjUI::Init(); }
~EdUI();
        //...
};

//---------------------------------------------------------
//TexUI.h
class TexUI : public virtual QDialog, public virtual Ui::Dialog
{
Q_OBJECT
protected:
void Init(); //connect-ы слотов с сигналами контролов вкладки
private slots:
        //слоты обработки вкладки Tex
};

//---------------------------------------------------------
//ObjUI.h
class ObjUI : public virtual QDialog, public virtual Ui::Dialog
{
Q_OBJECT
protected:
void Init(); //connect-ы слотов с сигналами контролов вкладки
private slots:
        //слоты обработки вкладки Obj
};


И всё бы хорошо, но как только я начал создавать слоты в каждом из родительских объектов, оказалось, что форма реагирует только на сигналы/слоты, законнекченные в первом из указанных в списке наследования классов.
В данном случае, это означает, что события вкладки Obj отрабатываются нормально, в то время как на контролы вкладки Tex программа не реагирует.
Как только я заменяю порядок наследования:
Код:
class EdUI
: public TexUI,
 public ObjUI,
 public virtual QDialog,
 public virtual Ui::Dialog

ситуация меняется на противоположную: обрабатывается вкладка Tex, а вкладка Obj не обрабатывается.

Я подозреваю, что дело в той мета-информации, которую генерирует утилита moc по каждому из моих хедэров EdUI.h, ObjUI.h, TexUI.h. Видимо, она несовместима с таким вот множественным наследованием.

Пока не хватает опыта в QT, чтобы решить проблему. Помогите, пожалуйста, у кого есть опыт.
Записан
Lom
Гость
« Ответ #1 : Май 30, 2007, 20:31 »

Предлагаю сделать следующее:

Код:

class TexUI : public QWidget
{
    TexUI()
   {
     //init
   }
};

class ObjUI : public QWidget
{
    ObjUI()
   {
     //init
   }
};

class EdUI : public QDialog
{
   QTabWidget *m_pPages;

   EdUI()
   {
        m_pPages = new QTabWidget(this);
        m_pPages->addTab(new TexUI, "TexUI");
        m_pPages->addTab(new ObjUI, "ObjUI");
   }
};

Получим действительно страницу с закладками, каждая из которых будет делать только то, что нужно этой закладке, и ничего не знать о другой. Мало того, такие классы (TexUI и ObjUI) можно будет класть в любое место, куда можно положить виджет.

А множественное наследование применять здесь неправильно, т.к. применение наследования подразумевает, что наследник должен обладать функционалом предка. Т.е. глядя на твое решения получается что диалог EdUI у тебя должен обладать функционалом каждой из закладок, которая на нем находится. Очевидно что это не так.
Записан
Tonal
Гость
« Ответ #2 : Май 31, 2007, 14:42 »

Что-то как-то наворочено получилось...
Зачем тут вообще наследование применять?

Я, когда делал подобное, каждую вкладку сделал виджетом.
В них всё и обрабатывал.
А главная форма - создаёт все дочерние и координирует.

Всё получается прозрачно и никакого лишнего наследования. ;-)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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