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

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

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

Приветствую всех!!!
У меня есть несколько классов с формами..из одного класса вызывается второй, а из второго-третий...и вот мне надо, чтобы при закрытии самой первой формы закрывались все остальные,которые открыты..как это правильно организовать, подскажите пожалуйста!!!Я так полагаю,что нужно перегрузить функцию closeEvent(QCloseEvent *event)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июль 13, 2009, 09:17 »

можно удалять исходную по закрытию (ключевое слово: DeleteOnClose)
Записан

Юра.
Evgeniya
Гость
« Ответ #2 : Июль 13, 2009, 10:48 »

Вставляю при вызове в конструкторе самого первого класса:
this->setAttribute(Qt::WA_DeleteOnClose);
теперь при закрытии самой первой формы закрываются и остальные, но в процессах они остаются все почему-то  Грустный
Записан
Evgeniya
Гость
« Ответ #3 : Июль 13, 2009, 13:25 »

И вот при этом, при открытии из первого окна второго, а потом при закрытии первого ... вызывается сначало деструктор первого класса, затем деструктор вторго, а потом почему-то опять вызывается деструктор первого...
Записан
Evgeniya
Гость
« Ответ #4 : Июль 13, 2009, 14:43 »

Разобралася...создала самую первую форму(которая в main вызывается) в куче и сейчас вроде все нормально работает...значит в этом была причина.
или я ошибаюся???
Записан
Evgeniya
Гость
« Ответ #5 : Июль 13, 2009, 15:05 »

все конечно нормано работает, только из памяти это приложение не удаляется Грустный(
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

Выложи сюда исходный код
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Evgeniya
Гость
« Ответ #7 : Июль 13, 2009, 15:35 »

main.cpp
Код
C++ (Qt)
#include "auct.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
   QTextCodec *codec=QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForCStrings(codec);
    Auct *w= new Auct(0);
    w->show();
    return a.exec();
}
 
auct.cpp
Код
C++ (Qt)
#include "auct.h"
 
Auct::Auct(QWidget *parent)
    : QMainWindow(parent)
{
connection();
ui.setupUi(this);
auct=new QSqlQueryModel(0);
str="SELECT auction.id,Method_razm.Name,auction.Num_izv,Format(auction.Date_auct,'dd.mm.yyyy') "
        "FROM auction INNER JOIN Method_razm ON auction.rf_methodID=Method_razm.id";
auct->setQuery(str,db);
ui.tableView->setModel(auct);
ui.tableView->hideColumn(0); connect(ui.tableView,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(lpu()));
this->setAttribute(Qt::WA_DeleteOnClose);
}
Auct::~Auct()
{
  if(db.isOpen()) db.close();
}
void Auct::connection(){
db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("ls");
if(!db.open()){
QMessageBox::critical(0,"Ошибка подключения",db.lastError().text());
}
}
void Auct::lpu(){
int auctid;
  sel=ui.tableView->selectionModel();
  index=sel->currentIndex();   
auctid=auct->data(auct->index(index.row(),0)).toInt();
zak= new Zakazchik(this,auctid);
zak->show();
}
 
auct.h
Код
C++ (Qt)
#ifndef AUCT_H
#define AUCT_H
 
#include <QtGui/QMainWindow>
.....
 
 
#include "ui_Auct.h"
#include "zakazchik.h"
 
class Zakazchik;
class Auct : public QMainWindow
{
&#160; &#160; Q_OBJECT
 
public:
&#160; &#160; Auct(QWidget *parent = 0);
&#160; &#160; ~Auct();
&#160; &#160; void connection();
 
&#160; &#160; QSqlDatabase db;
&#160; &#160; QSqlQueryModel *auct;
&#160; &#160; QString str;
&#160; &#160; QModelIndex index;
&#160; &#160; QItemSelectionModel *sel;
&#160; &#160; Zakazchik *zak;
private:
&#160; &#160; Ui::AuctClass ui;
private slots:
&#160; &#160; void lpu();
};
#endif // AUCT_H
 

zakazchik.cpp
Код
C++ (Qt)
Zakazchik::Zakazchik(QWidget *parent,int auctID)
&#160; &#160; : QMainWindow(parent)
{
ui.setupUi(this);
auct.setNum(auctID);
db=QSqlDatabase::database();
zakazch=new QSqlQueryModel(0);
str="SELECT zakazchik.id,LPU.Name_LPU,LPU.INN,LPU.KPP,LPU.OGRN from "
&#160;&#160; "zakazchik INNER JOIN LPU ON zakazchik.rf_LPUID=LPU.Cod "
&#160;&#160; "where zakazchik.rf_auctID="+auct+"";
zakazch->setQuery(str);
ui.tableLPU->setModel(zakazch);
connect(ui.add_lpu,SIGNAL(clicked()),this,SLOT(add_lpu()));
connect(ui.tableLPU,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(zakaz()));
connect(ui.otm,SIGNAL(clicked()),this,SLOT(close()));
title=st;
}
Zakazchik::~Zakazchik()
{
 
}
 
  а в этом классе(в слоте zakaz()) вызывается еще 3 класс
« Последнее редактирование: Июль 13, 2009, 15:43 от Evgeniya » Записан
Evgeniya
Гость
« Ответ #8 : Июль 13, 2009, 17:34 »

Видимо потому что я в деструктории память не освобождаю....
А как проверить вообще был ли создан объект...просто у меня вторая форма создается только по слоту, поэтому не всегда м.б. создана. Значит и удалять ее нужно только когда она создана...подскажите функцию, если такая есть
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Июль 13, 2009, 17:43 »

>> а в этом классе(в слоте zakaz()) вызывается еще 3 класс
покажи основу этого слота, как объект создаётся.
Записан

Юра.
Evgeniya
Гость
« Ответ #10 : Июль 13, 2009, 17:47 »

Код
C++ (Qt)
void Zakazchik::zakaz(){
int zakazchid;
sel=ui.tableLPU->selectionModel();
index=sel->currentIndex();
zakazchid=zakazch->data(zakazch->index(index.row(),0)).toInt();
z=new Zakaz(this,zakazchid);
z->show();
}

Я кажется решила эту проблему...просто в деструкторе вызываемого класса Zakazchik добавила delete this; ... только насколько это правильно Непонимающий
Записан
Evgeniya
Гость
« Ответ #11 : Июль 13, 2009, 17:52 »

и теперь при закрытии главного окна закрываются дочерние и он не висит в памяти...

А вот если я создаю QTableView, например вот так
QTableView *tab=new QTableView(0);
tab->show();
Мне потом надо в деструкторе освобождать память и писать delete tab;
или в этом случае при удалении класса, из которого вызывается tab, об этом беспокоится деструктор QTableView??
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


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

>>Мне потом надо в деструкторе освобождать память и писать delete tab;
Надо так как ты не задаёшь родителя ( QTableView(0) )
А заботится об удалении детей именно родитель
Записан

Юра.
Evgeniya
Гость
« Ответ #13 : Июль 14, 2009, 08:07 »

>>Мне потом надо в деструкторе освобождать память и писать delete tab;
Надо так как ты не задаёшь родителя ( QTableView(0) )
А заботится об удалении детей именно родитель
а tab->close() не прокатит??
Записан
ufna
Гость
« Ответ #14 : Июль 14, 2009, 10:35 »

Если есть у нее WA_DeleteOnClose, то прокатит.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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