Отложенная инициализация окна |
Здравствуйте, гость ( Вход | Регистрация )
Отложенная инициализация окна |
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, 8:10
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
ViGOur |
13.1.2010, 10:02
Сообщение
#3
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
разве? угу, а ты сам подумай, объект еще не создан, а уже нужно обращаться к его виртуальной таблице, результат не однозначен короче. Можно попробовать переопределить в классе CMsgWindow слот show и в нем уже вызывать нужную тебе функцию, ну и не забыть вызвать слот show базового класса. |
|
|
aljeshishe |
13.1.2010, 17:57
Сообщение
#4
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
Как это переопределить слот show. А что это даст, он же не виртуальный? Этот слот вызывается при выполнении QApplication::processEvents(), который о нашем классе ничего не знает и вызовет оригинальную версию слота.
Вариантов то как решить дофига, можно и просто виртуальную функцию init сделать и вызывать ее при создании окна. Можно сделать startTimer(0) и поместить init в timerEvent(). Вопрос в том как сделать это правильно, красиво и элегантно. Я не знаю, может проблема вообще надуманная, и все решается гораздо проще, поэтому просьба отписаться тех кто сталкивался и красиво решил. |
|
|
Litkevich Yuriy |
13.1.2010, 18:19
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
который о нашем классе ничего не знает и вызовет оригинальную версию слота. нет, он вызовет слот конкретного объекта. (с помощью сигнально-слотового соединения). А вообще можно обработать событие отображения. Вот ViGOur мне как-то давал код, я только посылку сигнала в нём сделал.
|
|
|
aljeshishe |
13.1.2010, 18:40
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
Ну как вариант, только это событие будет вызываться по-моему при каждом показывании окна (сворачивание-разворачивение), а иницализироваться надо однажды. Добавить флажок и будет работать
|
|
|
kuler |
13.1.2010, 19:18
Сообщение
#7
|
Танцор диско Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: -1 |
а разве обязательно setupUI в конструкторе?
|
|
|
Litkevich Yuriy |
13.1.2010, 23:12
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
aljeshishe |
14.1.2010, 18:31
Сообщение
#9
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
Всем спасибо. Отложенный метод без труда вызывается через invokeMethod, так меньше кода.
А менюшки, тулбары видимо придется делать на основе контейнера c QAction'ами |
|
|
Текстовая версия | Сейчас: 30.12.2024, 19:17 |