Russian Qt Forum
Ноябрь 25, 2024, 08:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: проблемы с удалением немодальных окон  (Прочитано 19829 раз)
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();
 
}
Не знаю ... что-то в этом всем меня смущает...
Если кто сталкивался с подобным, подскажите, плз...
Записан
Dodge
Гость
« Ответ #1 : Ноябрь 27, 2007, 23:19 »

Охренеть... вызов метода объекта, после его удаления, причем внутри самого объекта...
...или я не так понял?
Записан
antipart
Гость
« Ответ #2 : Ноябрь 27, 2007, 23:36 »

Да , не так понял...
Удаляется динамически созданное окно при выходе из главного окна...
хотя по идее это должно делаться автоматически...  как со всеми динамическими виджетами потомками (кнопками , таблицами)...
мы же их не удаляем вручную...  а здесь приходится... вот я и не пойму почему...
Записан
Dodge
Гость
« Ответ #3 : Ноябрь 28, 2007, 00:25 »

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

Возможно я не туда смотрю, но пожалуйста выложите код создания главного окна, и его чилдов. Будет наглядней.
Записан
antipart
Гость
« Ответ #4 : Ноябрь 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();
 }
Записан
antipart
Гость
« Ответ #5 : Ноябрь 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();
}
Записан
Tonal
Гость
« Ответ #6 : Ноябрь 28, 2007, 11:19 »

В Qt "главных" окон может быть сколько угодно.
Которое из твоих главнее системе не ясно.
Так что всё правильно.

Если хочешь, чтобы при закрытии w (экземпляра BaseForm) закрывалось и window - закрывай его руками, или установи для w атрибут WA_DeleteOnClose
Записан
Lion
Гость
« Ответ #7 : Ноябрь 28, 2007, 16:08 »

Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm.
Записан
fanat9
Гость
« Ответ #8 : Ноябрь 28, 2007, 16:46 »

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

При closeEvent'e пробегаться по списку и удалять всех возможных потомков можно, но не красиво  - можно про кого-нибудь забыть. Особенно в случае, если у потомков тоже есть немодальные диалоги.
Сам не сталкивался, но imho стоит внимательнее смотреть в сторону флагов на автоматическое удаление.
Записан
ритт
Гость
« Ответ #9 : Ноябрь 28, 2007, 16:59 »

лион, -1
не поленись доказать своё утверждение


фанат,
как будет свободное время, почитаю сорцы - объясню "механизм почему так происходит"
сейчас не до этого
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Ноябрь 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
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Ноябрь 28, 2007, 17:52 »

Если QMainWindow отображается в виде отдельного окна, то у него parent() == NULL, иначе это окно обображалось бы внутри BaseForm.

Серьёзно?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Dodge
Гость
« Ответ #12 : Ноябрь 28, 2007, 20:00 »

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

При closeEvent'e пробегаться по списку и удалять всех возможных потомков можно, но не красиво  - можно про кого-нибудь забыть. Особенно в случае, если у потомков тоже есть немодальные диалоги.
Сам не сталкивался, но imho стоит внимательнее смотреть в сторону флагов на автоматическое удаление.
Что за ерунда?... закрытие окна не означает его удаление.
Если надо завершить программу при закрытии какого либо окна, то вешаем на его событие - closeEvent метод QApplication quit.
Записан
fanat9
Гость
« Ответ #13 : Ноябрь 28, 2007, 21:29 »

Цитировать
Что за ерунда?... закрытие окна не означает его удаление.

Сам понял чего написал ? Закрытие какого окна не означает его удаление ?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #14 : Ноябрь 28, 2007, 21:41 »

Закрытие какого окна не означает его удаление ?

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

Учим мат часть!
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.