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'ы ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 13.1.2010, 18:19
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(aljeshishe @ 13.1.2010, 20:57) *
который о нашем классе ничего не знает и вызовет оригинальную версию слота.
нет, он вызовет слот конкретного объекта. (с помощью сигнально-слотового соединения). А вообще можно обработать событие отображения. Вот ViGOur мне как-то давал код, я только посылку сигнала в нём сделал.
bool MainWindow::event(QEvent *p_event)
{
    if( p_event->type() == QEvent::ShowToParent)
        emit SigShow();

    return QWidget::event(p_event);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
aljeshishe
  опции профиля:
сообщение 13.1.2010, 18:40
Сообщение #3


Студент
*

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

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




Репутация:   0  


Ну как вариант, только это событие будет вызываться по-моему при каждом показывании окна (сворачивание-разворачивение), а иницализироваться надо однажды. Добавить флажок и будет работать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 3.10.2024, 22:41