crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Отложенная инициализация окна
aljeshishe
  опции профиля:
сообщение 12.1.2010, 23:56
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 1.12.2009
Пользователь №: 1271

Спасибо сказали: 2 раз(а)




Репутация:   0  


Не знаю, возможно это все бред, но... в упрощенном виде проблема следующая
Есть базовый класс окна
class CMsgWindow : public QMainWindow
Тут определяются элементы интерфейса общие для дочерних классов окон
Например пункт меню Собщение\сохранить
Есть дочерние классы
class CInMsgWindow : public CMsgWindow
class COutMsgWindow : public CMsgWindow
В них определяется специфика.
Например пункты меню Собщение\принять и
Собщение\отправить соответственно.
Проблема в том, что не всегда вызывая в конструкторе setupUi(this), можно добиться нужного эффекта.
Например сначала в конструкторе CMsgWindow добавляется пункт "сохранить", а затем
в конструкторе CInMsgWindow добавляется "принять". В результате получается не тот порядок пунктов меню который нужен, обусловленный порядком вызова конструкторов. Можно привести более сложные примеры...
Все решила бы виртуализация функции инициализации элементов интерфейса. Тогда в дочернем классе можно вызывать функцию базового класса когда угодно, можно и вообще не вызывать.
Но проблема в том, что виртуальные функции нельзя использовать в конструкторах.
Отсюда вопрос, когда можно инициализировать элементы интерфейса, кроме как в конструкторе, при этом не меняя код создателя окна, оставляя его максимально простым:
CMsgWindow *p = new CInMsgWindow;
p->show();
Event'ы ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
aljeshishe
  опции профиля:
сообщение 13.1.2010, 17:57
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 1.12.2009
Пользователь №: 1271

Спасибо сказали: 2 раз(а)




Репутация:   0  


Как это переопределить слот show. А что это даст, он же не виртуальный? Этот слот вызывается при выполнении QApplication::processEvents(), который о нашем классе ничего не знает и вызовет оригинальную версию слота.
Вариантов то как решить дофига, можно и просто виртуальную функцию init сделать и вызывать ее при создании окна. Можно сделать startTimer(0) и поместить init в timerEvent(). Вопрос в том как сделать это правильно, красиво и элегантно. Я не знаю, может проблема вообще надуманная, и все решается гораздо проще, поэтому просьба отписаться тех кто сталкивался и красиво решил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 9.12.2023, 10:52