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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: как организовать закрытие формы,если в ней были открыты другие формы  (Прочитано 19750 раз)
Evgeniya
Гость
« Ответ #15 : Июль 15, 2009, 08:25 »

Так и не получается решить данную проблему...Грустный(
Выкладыаю простенький код
main.cpp
Код
C++ (Qt)
#include "main_form.h"
 
#include <QtGui>
#include <QApplication>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QTextCodec *codec=QTextCodec::codecForName("CP1251");
   QTextCodec::setCodecForCStrings(codec);
   main_form *w=new main_form(0);
   w->show();
   return a.exec();
}
 
main_form.cpp
Код
C++ (Qt)
#include "main_form.h"
 
main_form::main_form(QWidget *parent)
   : QMainWindow(parent)
{
ui.setupUi(this);
this->setWindowTitle("Главная");
setAttribute(Qt::WA_DeleteOnClose);
connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(sl()));
}
 
main_form::~main_form()
{
//QMessageBox::information(0,"деструктор","для main_form");
}
void main_form::sl(){
 t=new doch(this);
 t->show();
}
 
main_form.h
Код
C++ (Qt)
#ifndef MAIN_FORM_H
#define MAIN_FORM_H
 
#include <QtGui/QMainWindow>
#include "ui_main_form.h"
#include "doch.h"
 
class doch;
class main_form : public QMainWindow
{
   Q_OBJECT
 
public:
   main_form(QWidget *parent = 0);
   ~main_form();
   doch *t;
 
private:
   Ui::main_formClass ui;
private slots:
   void sl();
};
 
#endif // MAIN_FORM_H
 
doch.cpp
Код
C++ (Qt)
#include "doch.h"
 
doch::doch(QWidget *parent)
   : QMainWindow(parent)
{
ui.setupUi(this);
this->setWindowTitle("дочерняя");
}
 
doch::~doch()
{
//QMessageBox::about(0,"деструктор","для two");
}
 
doch.h
Код
C++ (Qt)
#ifndef DOCH_H
#define DOCH_H
 
#include <QtGui/QMainWindow>
#include <QMessageBox>
#include <QCloseEvent>
#include "ui_doch.h"
 
class doch : public QMainWindow
{
   Q_OBJECT
 
public:
   doch(QWidget *parent = 0);
   ~doch();
 
private:
   Ui::DochClass ui;
};
 
#endif

Cдесь при закрытии главного окна,закрывается и дочернее окно..только вот из процессов экзешник не удаляется...неужели эта проблема может возникнуть из-за библиотек Qt,которые я исползую??
Записан
spectre71
Гость
« Ответ #16 : Июль 15, 2009, 10:49 »

Так лучше
Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QTextCodec *codec=QTextCodec::codecForName("CP1251");
   QTextCodec::setCodecForCStrings(codec);
   main_form w;
   w.show();
   return a.exec();
}
Записан
Evgeniya
Гость
« Ответ #17 : Июль 15, 2009, 11:00 »

Да,но тогда в таком случае выскакивает системная ошибка Грустный((, т.к. в таком случае вызываются 2 деструктора...у меня же установлен атрибут Qt::WA_DeleteOnClose
А еще я заметила, что если раскомментировать в деструктре QMessageBox , то все  в процессах удаляется почему-то
Записан
spectre71
Гость
« Ответ #18 : Июль 15, 2009, 11:17 »

Да,но тогда в таком случае выскакивает системная ошибка Грустный((, т.к. в таком случае вызываются 2 деструктора...у меня же установлен атрибут Qt::WA_DeleteOnClose
А еще я заметила, что если раскомментировать в деструктре QMessageBox , то все  в процессах удаляется почему-то
Так убери этот атрибут
Записан
Evgeniya
Гость
« Ответ #19 : Июль 15, 2009, 11:23 »

Так он мне нужен...Мне нужно, чтобы при закрытии главной формы закрывалась и дочерняя
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #20 : Июль 15, 2009, 11:37 »

cоедини слот close() у главной формы со слотом quit() у QApplication'а. всё
Записан
Evgeniya
Гость
« Ответ #21 : Июль 15, 2009, 12:44 »

cоедини слот close() у главной формы со слотом quit() у QApplication'а. всё

это в функции main нужно соединить???т.е. написать
QObject::connect(&w,SLOT(close()),&a,SLOT(quit()));

Я правильно понимаю??
такое ощущене, что программа вообще не реагирует на этот connect, видимо не правильно написала ;((
Записан
developer
Гость
« Ответ #22 : Июль 15, 2009, 12:45 »

в свое время у меня тоже была данная проблема. Решыл ее следующим образом.
Припустим у меня есть три класса с формами: Form1, Form2, Form3.
Делаю класс
VerySeriousClass:
{
Form1* f1;
Form2* f2:
Form3* f3;
QMap<int, QWidget> globalmap;
}
Создаю динамически все три формы и запихиваю их в словарь globalmap:
globalmap[1] = new Form1;
globalmap[2] = new Form2;
globalmap[3] = new Form3;

Каждая форма должна иметь свой деструктор, или нужно обеспечить ее корректное  удаление.
После использования всех форм я просто удаляю globalmap. И еще для показа форм я использую show() когда нужно,  hide() когда нуно форму скрить. И перехвачиваю евент close() той формы, после которой нужно удалить  globalmap - то-есть закрить все формы.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #23 : Июль 15, 2009, 12:56 »

оговорился, не слот а конечно сигнал закрытия, сейчас гляну как точно зовется
added: ойоой я наврал( не делай как я говорю:)
added2: можно попробовать соединить сигнал void destroyed ( QObject * obj = 0 ) и слот quit(), но не факт что форма дестроится
« Последнее редактирование: Июль 15, 2009, 13:00 от Авварон » Записан
spectre71
Гость
« Ответ #24 : Июль 15, 2009, 12:58 »

Так он мне нужен...Мне нужно, чтобы при закрытии главной формы закрывалась и дочерняя
Qt::WA_DeleteOnClose никак не связан с закрытием дочерних окон!!!
Записан
Evgeniya
Гость
« Ответ #25 : Июль 15, 2009, 13:10 »

Так он мне нужен...Мне нужно, чтобы при закрытии главной формы закрывалась и дочерняя
Qt::WA_DeleteOnClose никак не связан с закрытием дочерних окон!!!

просто при установленном свйстве Qt::WA_DeleteOnClose при закрытии объект удаляется и следовательно удаляет дочерние объекты...и получается, что при закрытии главной дочерняя-то закрывается, только вот  в процессах  экзешник остается
Записан
spirit
Гость
« Ответ #26 : Июль 15, 2009, 13:10 »

Так он мне нужен...Мне нужно, чтобы при закрытии главной формы закрывалась и дочерняя
Qt::WA_DeleteOnClose никак не связан с закрытием дочерних окон!!!
м... это почему? если этот атрибут установлен для парента, а вся иерархия детей построена на паренте (т.е. задан парент для каждого ребенка),
то при закрытии парента (последует его удаление благодаря Qt::WA_DeleteOnClose) все дети будут уничтожены.
Записан
Evgeniya
Гость
« Ответ #27 : Июль 15, 2009, 13:19 »

м... это почему? если этот атрибут установлен для парента, а вся иерархия детей построена на паренте (т.е. задан парент для каждого ребенка),
то при закрытии парента (последует его удаление благодаря Qt::WA_DeleteOnClose) все дети будут уничтожены.

так и должно быть поидее...но почему из процессов экзешник не удаляется???может нужно в деструкторе деток  тогда что-то дописать???
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #28 : Июль 15, 2009, 13:21 »

причем тут деструкторы форм? напиши
int a = app.exec();
qDebug() << "вротмненоги";
return a;

если в консоль по закрытии окон пишется "вротмненоги", значит все ок, и НЕ гляди в диспетчер задач убогой винды
Записан
Evgeniya
Гость
« Ответ #29 : Июль 15, 2009, 13:42 »

если в консоль по закрытии окон пишется "вротмненоги", значит все ок, и НЕ гляди в диспетчер задач убогой винды

У меня после закрытия прилложения оно не компилится, говорит, что оно открыто уже...так бы я навероное и не заметила
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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