Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: antipart от Ноябрь 27, 2007, 20:48



Название: проблемы с удалением немодальных окон
Отправлено: antipart от Ноябрь 27, 2007, 20:48
Проблема в следующем:
Есть главное окно QMainWindow, в котором динамически создается немодальное окно в таком виде:
QMainWindow *window; - является члено класса
window=0; - инициируется в конструкторе главного окна
далее в одной из функций создается само окно
window =new QMainWindow(this);
Теперь если закрыть главное окно приложения дочернее не убивается - вопрос почему?
Везде написано, что за уничтожение потомков отвечат предок!
w->setAttribute(Qt::WA_DeleteOnClose); для главного окна не устраивает т.к визуально все работает отлично(все заекрывается) , а приложение висит в памяти...
Пока остановился на таком решении:
Код:
void BaseForm::Quit()
{
delete window;
close();
 
}
Не знаю ... что-то в этом всем меня смущает...
Если кто сталкивался с подобным, подскажите, плз...


Название: Re: проблемы с удалением немодальных окон
Отправлено: Dodge от Ноябрь 27, 2007, 23:19
Охренеть... вызов метода объекта, после его удаления, причем внутри самого объекта...
...или я не так понял?


Название: Re: проблемы с удалением немодальных окон
Отправлено: antipart от Ноябрь 27, 2007, 23:36
Да , не так понял...
Удаляется динамически созданное окно при выходе из главного окна...
хотя по идее это должно делаться автоматически...  как со всеми динамическими виджетами потомками (кнопками , таблицами)...
мы же их не удаляем вручную...  а здесь приходится... вот я и не пойму почему...


Название: Re: проблемы с удалением немодальных окон
Отправлено: Dodge от Ноябрь 28, 2007, 00:25
Всеравно не срвсем понятно в чем дело... вообще, если хотите по закрытию главного окна, закрывать программу, то можно вызывать метод quit а объекта QApplication.

Возможно я не туда смотрю, но пожалуйста выложите код создания главного окна, и его чилдов. Будет наглядней.


Название: Re: проблемы с удалением немодальных окон
Отправлено: antipart от Ноябрь 28, 2007, 02:28
mainform.h
Код:
#ifndef MAINFORM_H
#define MAINFORM_H

#include "ui_mainform.h"
 
    class BaseForm : public QMainWindow

    {
        Q_OBJECT

    public:
        BaseForm(QWidget *parent =0);

   private slots:

        void Quit();
void Test();

   private:
        Ui::MainWindow form;
       QMainWindow *window;
    };
#endif

mainform.cpp
 
Код:
BaseForm::BaseForm(QWidget *parent): QMainWindow(parent)         
   {           
       
        form.setupUi(this);
        window=0;
     // conections ......
     QObject::connect(form.pushButton, SIGNAL(clicked()), this, SLOT(Quit()));
     QObject::connect(form.pushButton_2, SIGNAL(clicked()), this, SLOT(Test()));
   }

void BaseForm::Test()
{

   if(!window) { window= new QMainWindow (this); }
 
   window->show();
   window>activateWindow();
}

void BaseForm::Quit()
{
delete window; //<<<<<<<<<----если этого не делать то это дочернее окно не умирает после закрытия главной формы предка!!!
close();
 }


Название: Re: проблемы с удалением немодальных окон
Отправлено: antipart от Ноябрь 28, 2007, 02:32
забыл main.cpp
Код:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    BaseForm *w = new BaseForm;
  //  window->setAttribute(Qt::WA_DeleteOnClose); <<<<< ---- так тоже пробовал
    w->show();

    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
    return app.exec();
}


Название: Re: проблемы с удалением немодальных окон
Отправлено: Tonal от Ноябрь 28, 2007, 11:19
В Qt "главных" окон может быть сколько угодно.
Которое из твоих главнее системе не ясно.
Так что всё правильно.

Если хочешь, чтобы при закрытии w (экземпляра BaseForm) закрывалось и window - закрывай его руками, или установи для w атрибут WA_DeleteOnClose


Название: Re: проблемы с удалением немодальных окон
Отправлено: Lion от Ноябрь 28, 2007, 16:08
Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm.


Название: Re: проблемы с удалением немодальных окон
Отправлено: fanat9 от Ноябрь 28, 2007, 16:46
Примеры ведут себя так же.
Посмотрите например \examples\widgets\stylesheet.
Там диалог(QDialog) StyleEditor'а не закрывается с закрытием главного окна, хотя является его child'ом, что указано явно при его инициализации: styleSheetEditor = new StyleSheetEditor(this);
Кто-нибудь может объяснить механизм почему так происходит ?

При closeEvent'e пробегаться по списку и удалять всех возможных потомков можно, но не красиво  - можно про кого-нибудь забыть. Особенно в случае, если у потомков тоже есть немодальные диалоги.
Сам не сталкивался, но imho стоит внимательнее смотреть в сторону флагов на автоматическое удаление.


Название: Re: проблемы с удалением немодальных окон
Отправлено: ритт от Ноябрь 28, 2007, 16:59
лион, -1
не поленись доказать своё утверждение


фанат,
как будет свободное время, почитаю сорцы - объясню "механизм почему так происходит"
сейчас не до этого


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 28, 2007, 17:49
Есть ещё такой вот метод QApplication::closeAllWindows() который:

Цитировать
Closes all top-level windows.
This function is particularly useful for applications with many top-level windows. It could, for example, be connected to a Exit entry in the File menu


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 28, 2007, 17:52
Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm.

Серьёзно?


Название: Re: проблемы с удалением немодальных окон
Отправлено: Dodge от Ноябрь 28, 2007, 20:00
Примеры ведут себя так же.
Посмотрите например \examples\widgets\stylesheet.
Там диалог(QDialog) StyleEditor'а не закрывается с закрытием главного окна, хотя является его child'ом, что указано явно при его инициализации: styleSheetEditor = new StyleSheetEditor(this);
Кто-нибудь может объяснить механизм почему так происходит ?

При closeEvent'e пробегаться по списку и удалять всех возможных потомков можно, но не красиво  - можно про кого-нибудь забыть. Особенно в случае, если у потомков тоже есть немодальные диалоги.
Сам не сталкивался, но imho стоит внимательнее смотреть в сторону флагов на автоматическое удаление.
Что за ерунда?... закрытие окна не означает его удаление.
Если надо завершить программу при закрытии какого либо окна, то вешаем на его событие - closeEvent метод QApplication quit.


Название: Re: проблемы с удалением немодальных окон
Отправлено: fanat9 от Ноябрь 28, 2007, 21:29
Цитировать
Что за ерунда?... закрытие окна не означает его удаление.

Сам понял чего написал ? Закрытие какого окна не означает его удаление ?


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 28, 2007, 21:41
Закрытие какого окна не означает его удаление ?

Любого. Даже если окно закрываеть, сам объект не удаляеться (заисключением ситуации, когда установлен аттрибут Qt::WA_DeleteOnClose). Окно просто хайдиться.

Учим мат часть!


Название: Re: проблемы с удалением немодальных окон
Отправлено: fanat9 от Ноябрь 28, 2007, 22:01
И за исключением когда закрывается последнее окно и возможно ещё в нескольких ситуациях. Я собственно и имел это ввиду - просто не понравилась фраза:  "закрытие окна не означает его удаление" - иногда означает.


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 28, 2007, 22:22
И за исключением когда закрывается последнее окно...

Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться!
Полное освобождение ресурсов происходит когда окно создано в стеке или удалено явно после завершения приложения.

...и возможно ещё в нескольких ситуациях

В каких ситуациях? Поделитесь информацией с остальными, не жадничайте ;)


Название: Re: проблемы с удалением немодальных окон
Отправлено: fanat9 от Ноябрь 28, 2007, 22:35
Цитировать
Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться!
Полное освобождение ресурсов происходит когда окно создано в стеке или удалено явно после завершения приложения.

А если нет ? И пример такой можно чтобы мне разобраться до конца ?

Цитировать
В каких ситуациях? Поделитесь информацией с остальными, не жадничайте
А например когда closeEvent() переопределен, вот  ;D


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 28, 2007, 22:48
А если нет ? И пример такой можно чтобы мне разобраться до конца ?

Помоему вы сами можете написать этот пример, или нет?


Название: Re: проблемы с удалением немодальных окон
Отправлено: Dodge от Ноябрь 28, 2007, 22:58
Помоему вы сами можете написать этот пример, или нет?
Просто человек не знает о чем говорит.

На самом деле есть некоторые проблемы с автоматическим удалением окон(если угодно объектов QWidget и их наследников), если не использовать Qt::WA_DeleteOnClose.

Я в свое время прибывал в некотором недоумении, когда например deleteLater() в переопределенном методе closeEvent виджета, приводило к падению программы. Версию qt точно не скажу, но возможно даже в 4.3.0.
Есть некоторые моменты при работе с виждетами, которые я не понимаю или не знаю. Обычно в таких ситуациях я не разбираюсь в чем проблема, а нахожу альтернативный способ ее решить, ибо времени жалко.


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 28, 2007, 23:02
Просто человек не знает о чем говорит.

2 Dodge: А кому адресован этот пост, мне или fanat9?


Название: Re: проблемы с удалением немодальных окон
Отправлено: Dodge от Ноябрь 28, 2007, 23:04
2 Dodge: А кому адресован этот пост, мне или fanat9?
fanat9 естесно...


Название: Re: проблемы с удалением немодальных окон
Отправлено: Lion от Ноябрь 29, 2007, 07:50
Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm.

Серьёзно?
Как правило да, но выяснилось что это не отностится к QDialog и QMainWiondow.


Название: Re: проблемы с удалением немодальных окон
Отправлено: ритт от Ноябрь 29, 2007, 09:00
хм...интересно какое это правило? когда мэйнвиндов создаётся из главной функции и ни одного виджета ещё не существует, чтобы поставить его родителем окну?
охренеть, правило...скорее уж, нужда.


Название: Re: проблемы с удалением немодальных окон
Отправлено: antipart от Ноябрь 29, 2007, 20:20
Цитировать
Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться!
так этот атрибут (Qt::WA_DeleteOnClose) нужно для каждого динамического окна указывать?

пробовал указывать только для главного окна и мне не очень понравился результат...-все окна закрываются (вроде как положено) , но приложение висит в задачах...
в моем случае (окон не много) получилось нормально выйти только при помощи delete потомка при закрытии предка...


Название: Re: проблемы с удалением немодальных окон
Отправлено: Вячеслав от Ноябрь 29, 2007, 20:40
Цитировать
Снова заблуждение! Для простоты возмем одно единственное окно. Если окно создано динамически, и аттрибут Qt::WA_DeleteOnClose отсутствует то после его закрытия программа завершается, но сам объект не удаляеться!
так этот атрибут (Qt::WA_DeleteOnClose) нужно для каждого динамического окна указывать?

пробовал указывать только для главного окна и мне не очень понравился результат...-все окна закрываются (вроде как положено) , но приложение висит в задачах...
в моем случае (окон не много) получилось нормально выйти только при помощи delete потомка при закрытии предка...
Чего-то меня стали сомнения терзать - ты случаем quitOnLastWindowClosed у QApplication'a не трогал ? Сигнал lastWindowClosed () ловиться ? Всетаки IMHO ты чего-то с родителями намудрил - у меня в SDI варианте проги создаеться туева хуча окон - а опосля нормально убиваются  с завершением приложения .....


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 29, 2007, 20:45
так этот атрибут (Qt::WA_DeleteOnClose) нужно для каждого динамического окна указывать?

пробовал указывать только для главного окна и мне не очень понравился результат...-все окна закрываются (вроде как положено) , но приложение висит в задачах...
в моем случае (окон не много) получилось нормально выйти только при помощи delete потомка при закрытии предка...

Нет, не для каждого. Я говрил про главное окно приложения. Когда оно создаеться динамически (при этом парента нет) окно не удаляеться. Qt::WA_DeleteOnClose решает эту проблему.

В вашем случае создаеться второе главное окно. Его нужно удалять или явно или задавать аттрибут Qt::WA_DeleteOnClose и вызывать close()


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 29, 2007, 20:49
Чего-то меня стали сомнения терзать - ты случаем quitOnLastWindowClosed у QApplication'a не трогал ? Сигнал lastWindowClosed () ловиться ? Всетаки IMHO ты чего-то с родителями намудрил - у меня в SDI варианте проги создаеться туева хуча окон - а опосля нормально убиваются  с завершением приложения .....

Все верное. Для каждого окна задан аттрибут Qt::WA_DeleteOnClose и при выходе из приложение вызываетсья closeAllWindows() etc. При этом происходит удаление всех окон и прога заверщает свою работу.

У antipart другой случай. Для вторго главного окна этот атрибут не задан, и при close не происходит его удаления. Окно просто хайдиться. В результате прога не завершае тсвою работу


Название: Re: проблемы с удалением немодальных окон
Отправлено: Вячеслав от Ноябрь 29, 2007, 20:52
Гы ;) А позвать dumpObjectTree ()  от qApp'a не судьба ? и посмотреть хто остался жив ?


Название: Re: проблемы с удалением немодальных окон
Отправлено: pastor от Ноябрь 29, 2007, 21:38
Гы ;) А позвать dumpObjectTree ()  от qApp'a не судьба ? и посмотреть хто остался жив ?

)))

Ну помоему и без dumpObjectTree() ясно кто весит


Название: Re: проблемы с удалением немодальных окон
Отправлено: Racheengel от Декабрь 01, 2007, 13:20
хм...интересно какое это правило? когда мэйнвиндов создаётся из главной функции и ни одного виджета ещё не существует, чтобы поставить его родителем окну?
охренеть, правило...скорее уж, нужда.

Я так понимаю, что имелся в виду тот факт, что создание виджета с parent=0 в конструкторе (или при setParent) выпихивает его в отдельное окно.

А по сути - надо либо parent для окна-самоубийцы указывать, либо руками прибивать в деструкторе главного окна.


Название: Re: проблемы с удалением немодальных окон
Отправлено: Racheengel от Декабрь 01, 2007, 13:24
Кстати, а про QApplication::setActiveWindow() не думали?


Название: Re: проблемы с удалением немодальных окон
Отправлено: Racheengel от Декабрь 01, 2007, 13:25
Охренеть, йа-джедай...


Название: Re: проблемы с удалением немодальных окон
Отправлено: ритт от Декабрь 01, 2007, 15:09
ну, по три мессага подряд - так и становятся джедаями :)


Название: Re: проблемы с удалением немодальных окон
Отправлено: aljeshishe от Январь 13, 2010, 18:35
Кстати, а про QApplication::setActiveWindow() не думали?
Код:
Sets the active window to the active widget in response to a system event
По-моему это что то другое...