Russian Qt Forum

Qt => Общие вопросы => Тема начата: Mindtraveller от Май 30, 2007, 16:37



Название: [4.2.2] Разделение обработки событий формы
Отправлено: 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, чтобы решить проблему. Помогите, пожалуйста, у кого есть опыт.


Название: [4.2.2] Разделение обработки событий формы
Отправлено: Lom от Май 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 у тебя должен обладать функционалом каждой из закладок, которая на нем находится. Очевидно что это не так.


Название: [4.2.2] Разделение обработки событий формы
Отправлено: Tonal от Май 31, 2007, 14:42
Что-то как-то наворочено получилось...
Зачем тут вообще наследование применять?

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

Всё получается прозрачно и никакого лишнего наследования. ;-)