crossplatform.ru

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


  Ответ в Отложенная инициализация окна
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
aljeshishe Дата 14.1.2010, 18:31
  Всем спасибо. Отложенный метод без труда вызывается через invokeMethod, так меньше кода.
А менюшки, тулбары видимо придется делать на основе контейнера c QAction'ами
Litkevich Yuriy Дата 13.1.2010, 23:12
 
Цитата(aljeshishe @ 13.1.2010, 21:40) *
Добавить флажок и будет работать
просто после того как отпала необходимость в инициализации, разорви соединение с сигналом SigShow
kuler Дата 13.1.2010, 19:18
  а разве обязательно setupUI в конструкторе?
aljeshishe Дата 13.1.2010, 18:40
  Ну как вариант, только это событие будет вызываться по-моему при каждом показывании окна (сворачивание-разворачивение), а иницализироваться надо однажды. Добавить флажок и будет работать
Litkevich Yuriy Дата 13.1.2010, 18:19
 
Цитата(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, 17:57
  Как это переопределить слот show. А что это даст, он же не виртуальный? Этот слот вызывается при выполнении QApplication::processEvents(), который о нашем классе ничего не знает и вызовет оригинальную версию слота.
Вариантов то как решить дофига, можно и просто виртуальную функцию init сделать и вызывать ее при создании окна. Можно сделать startTimer(0) и поместить init в timerEvent(). Вопрос в том как сделать это правильно, красиво и элегантно. Я не знаю, может проблема вообще надуманная, и все решается гораздо проще, поэтому просьба отписаться тех кто сталкивался и красиво решил.
ViGOur Дата 13.1.2010, 10:02
 
Цитата(Litkevich Yuriy @ 13.1.2010, 8:10) *
разве?
угу, а ты сам подумай, объект еще не создан, а уже нужно обращаться к его виртуальной таблице, результат не однозначен короче. :)

Можно попробовать переопределить в классе CMsgWindow слот show и в нем уже вызывать нужную тебе функцию, ну и не забыть вызвать слот show базового класса.
Litkevich Yuriy Дата 13.1.2010, 8:10
 
Цитата(aljeshishe @ 13.1.2010, 2:56) *
Но проблема в том, что виртуальные функции нельзя использовать в конструкторах.
разве?
aljeshishe Дата 12.1.2010, 23:56
  Не знаю, возможно это все бред, но... в упрощенном виде проблема следующая
Есть базовый класс окна
class CMsgWindow : public QMainWindow
Тут определяются элементы интерфейса общие для дочерних классов окон
Например пункт меню Собщение\сохранить
Есть дочерние классы
class CInMsgWindow : public CMsgWindow
class COutMsgWindow : public CMsgWindow
В них определяется специфика.
Например пункты меню Собщение\принять и
Собщение\отправить соответственно.
Проблема в том, что не всегда вызывая в конструкторе setupUi(this), можно добиться нужного эффекта.
Например сначала в конструкторе CMsgWindow добавляется пункт "сохранить", а затем
в конструкторе CInMsgWindow добавляется "принять". В результате получается не тот порядок пунктов меню который нужен, обусловленный порядком вызова конструкторов. Можно привести более сложные примеры...
Все решила бы виртуализация функции инициализации элементов интерфейса. Тогда в дочернем классе можно вызывать функцию базового класса когда угодно, можно и вообще не вызывать.
Но проблема в том, что виртуальные функции нельзя использовать в конструкторах.
Отсюда вопрос, когда можно инициализировать элементы интерфейса, кроме как в конструкторе, при этом не меняя код создателя окна, оставляя его максимально простым:
CMsgWindow *p = new CInMsgWindow;
p->show();
Event'ы ?
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 2:42