Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Ошибка при WA_DeleteOnClose


Автор: null56 26.11.2008, 15:15
Сразу скажу, что я лишь начинаю разбираться в qt4

Приведу пример кода методов....

Конструктора
Код

MainWindow :: MainWindow()
{
    setAttribute(Qt::WA_DeleteOnClose);
    createActions();
    createMenus();
    createToolBars();
}


Метода настроек двух кнопок
Код

    mpCloseAction = new QAction(tr("Close"), this);
    connect(mpCloseAction, SIGNAL(triggered()), this, SLOT(close()));

    mpExitAction = new QAction(tr("Exit"), this);
    mpExitAction->setStatusTip(tr("Exit etable"));
    mpExitAction->setShortcut(tr("Ctrl+Q"));
    connect(mpExitAction, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));


Метода создающего новое окно
Код

void MainWindow :: newFile()
{
    MainWindow * p_main_window = new MainWindow;
    p_main_window->show();
}


И метода при выходе
Код

void MainWindow :: closeEvent(QCloseEvent * pEvent)
{
    pEvent->accept();
}


Окна, которые были созданы методов newFile, закрываются нормально, но перначально созданное окно, вылетает с ошибкой.... 
Если убрать setAttribute(Qt::WA_DeleteOnClose);, то все работает, как и задумано...

В книжке написано, что объекты не уничтожаются после закрытия, поэтмоу надо указывать этот метод окна....

Вопросы:
1) я правильно понял назначение данного метода?
2) Почему же у меня ошибка.. при том пишет, что указатель, итпа не актуальный....
3) Нужно ли следить за вновь созданными объектами, чтобы своевременно их почистить?

Заранее благодарен за помощь...

Добавлено через 4 минуты
Нашел ошибку... В основном приложении я создавал статический объект первоначально созданного окна, и qt повторно пытался его удалить... создал динамически и все нормально заработало...
Извините за лишнюю тему на форме....

Автор: null56 26.11.2008, 15:30
Единственное, что хотел уточнить, действительно ли qt следит за всеми динамически созданными объектами - виджетами? и при необходимости может их удалять при закрытие окна?

Автор: SABROG 26.11.2008, 15:43
Цитата(null56 @ 26.11.2008,  15:30)
Единственное, что хотел уточнить, действительно ли qt следит за всеми динамически созданными объектами - виджетами? и при необходимости может их удалять при закрытие окна?

Только на базе QObject'a и только, если у объекта есть родитель. По сути это обычное дерево, где корень - главное окно, а контролы на нем - дети. Если удалять родительское окно, то в деструкторе сначала удаляются все дочерние элементы, а они уже по цепочке удаляют своих детей, пока ничего не останется. Если в конструктор объекта не передается указатель на родителя, то объект считается родителем и его удалять надо вручную или поставить флаг, чтобы оно удалялось при событии onClose.

Автор: null56 26.11.2008, 16:11
А реализовать это ручками, как будет выглядеть?

Я не совсем правильно выразился....

если мы создаем объект динамически, которого никто удалять не собирается, то мы должны всегда хранить указатель на него, чтобы потом сделать delete этого указателя?

Получается так? это единственный способ устранения утечки?

Автор: Elfebet 26.11.2008, 17:35
Цитата

если мы создаем объект динамически, которого никто удалять не собирается, то мы должны всегда хранить указатель на него, чтобы потом сделать delete этого указателя?


нет, если этот обьект дочерний от QWidget или QObject - то в ручную можна и не удалять
пример
Код

QPushButton *btn = new QPushButton(this) // обьект сам удалиться
QPushButton *btn = new QPushButton(0) // в этом случае может и не удалиться


пример может быть и корявый, но из слов SABROG - я так понял


хм.... да, пример корявый у QPushButton в любом случае будут родители, но суть я думаю ты понял

Автор: SABROG 26.11.2008, 18:11
Цитата(Elfebet @  26.11.2008,  17:35 Найти цитируемый пост)
хм.... да, пример корявый у QPushButton в любом случае будут родители


Если родитель в QPushButton не передается в конструктор, то он по-умолчанию 0.

Самый первый пример, который все видят при изучении Qt (hello, world): http://doc.trolltech.com/4.4/linguist-hellotr.html

Тут класс QPushButton является главным окном. В принципе все-равно какой контрол используется как главное окно, если он на базе QWidget.

Автор: JackYF 26.11.2008, 18:26
Метод, создающий новое окно, весьма странен.

Добавлено через 11 секунд
Хотя, не факт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)