Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt4] деструкторы для фом НЕвызываются 
:(
    Опции темы
zloyGamer
Дата 2.3.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



HELLLLLp!

специально напечатал небольшой примерчик для проверки и немогу понять в чем там проблема 
почемуто деструктор вызывается только для первой формы созданной в maine'е
что происходит с остальными(созданными из первой) неизвестно

в приложении мини тестовый проект 

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  test_destructors.zip 4,18 Kb
PM MAIL   Вверх
JackYF
Дата 2.3.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Зачем нам весь проект? Давай куски кода: как создаются формы, и как ты их убиваешь.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zloyGamer
Дата 2.3.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



ок
Код

#include "test1.h"

#include <QtGui>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    test1 w(0);
    w.show();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}


test1.h
Код

#ifndef TEST1_H
#define TEST1_H
#include <QtGui/QWidget>
#include "ui_test1.h"
class mtest;
class test1 :
    public QWidget,
    public Ui_testx1
{
    Q_OBJECT
public:
    test1(mtest *_mtest,QWidget *parent=0);
    ~test1();
    void show();

    mtest        *frmmtest;  //главная форма создается и вызывается после клика по pbmtest
public  slots:
    void on_pbtest2_clicked();
    void on_pbmtest_clicked();
};
#endif // TEST1_H


mtest.h
Код

#ifndef mtest_H
#define mtest_H
#include <QtGui/QWidget>
#include "ui_mtest.h"
class test2;
class test1;
class mtest :
    public QMainWindow,
    public Ui_mtestx
{
    Q_OBJECT
public:
    mtest(QMainWindow *parent = 0);
    ~mtest();
    void show();
//ссылки для связи с другими формами
    test2         *frmtest2;  
    test1         *frmtest1; //первая форма
public  slots:
    void on_pbtest1_clicked();
    void on_pbtest2_clicked();
};
#endif // mtest_H


test1.cpp
Код

#include "test1.h"
#include <QMessageBox>

#include "mtest.h"
#include "test2.h"

test1::test1(mtest *_mtest,QWidget *parent)
     :QWidget(parent)
{
    //QMessageBox::information(this, "test1::test1()" ,"");
    setupUi(this);
    frmmtest=_mtest;
}

test1::~test1()
{
  QMessageBox::information(this, "test1::~test1()" ,"");
}
void test1::show()
{
  //QMessageBox::information(this, "test1::show()" ,"");
  this->QWidget::show();
}
void test1::on_pbtest2_clicked()
{
    //QMessageBox::information(this, "test1::on_pbtest2_clicked()" ,"");
    if(frmmtest==0)
    {
      QMessageBox::information(this, "CREATE mtest" ,"");
      frmmtest=new mtest(0);
      frmmtest->frmtest1=this;
    }
    if(frmmtest->frmtest2==0)
    {
      QMessageBox::information(this, "CREATE test2" ,"");
      frmmtest->frmtest2=new test2(frmmtest);
    }
    frmmtest->frmtest2->show();
}
void test1::on_pbmtest_clicked()
{
    //QMessageBox::information(this, "test1::on_pbmtest_clicked()" ,"");
    if(frmmtest==0)
    {
      QMessageBox::information(this, "CREATE mtest" ,"");
      frmmtest=new mtest(0);
      frmmtest->frmtest1=this;
    }
    frmmtest->show();

}


mtest.cpp
Код

#include "mtest.h"
#include <QMessageBox>

#include "test1.h"
#include "test2.h"

mtest::mtest(QMainWindow *parent)
      :QMainWindow(parent)
{
    //QMessageBox::information(this, "mtest::mtest" ,"");
    setupUi(this);
    frmtest1=0;
    frmtest2=0;
    QApplication::setActiveWindow(this);
}
void mtest::show()
{
  //QMessageBox::information(this, "mtest::show()" ,"");
  this->QWidget::show();
}
mtest::~mtest()
{
  QMessageBox::information(this, "mtest::~mtest()" ,"");
  delete frmtest2;
  delete frmtest1;
}
void mtest::on_pbtest1_clicked()
{
  //QMessageBox::information(this, "mtest::on_pbmtest1_clicked()" ,"");
  if(frmtest1==0)
  {
    QMessageBox::information(this, "CREATE test1" ,"");
    frmtest1=new test1(this);
  }
  frmtest1->show();
}
void mtest::on_pbtest2_clicked()
{
  //QMessageBox::information(this, "mtest::on_pbmtest2_clicked()" ,"");
  if(frmtest2==0)
  {
    QMessageBox::information(this, "CREATE test2" ,"");
    frmtest2=new test2(this);
  }
  frmtest2->show();
}


test2 - тож самое что и test1 тока с заменой строк "test1" на "test2"

Добавлено через 4 минуты и 16 секунд
проблема в том что даже если и создаешь mtest 
выдается тока одно сообщение "test1::~test1()"
значит деструктор mtest::~mtest() не вызывается
PM MAIL   Вверх
JackYF
Дата 2.3.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(zloyGamer @  2.3.2008,  11:49 Найти цитируемый пост)
почемуто деструктор вызывается только для первой формы созданной в maine'е

Так, ну я ни одного delete не увидел. Кто же будет твои формы убивать, как не ты?

Цитата(zloyGamer @  2.3.2008,  13:54 Найти цитируемый пост)
значит деструктор mtest::~mtest() не вызывается 

и не должен. Формой не владеет никто - некому, кроме программиста вызывать деструктор.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zloyGamer
Дата 2.3.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



ну вот,  
а если mtest создавать в майне то все удаляется,
блин
проблема в главном приложении была не из-за этого

Добавлено через 2 минуты и 23 секунды
там QSqlQueryModel косячит,
я его создаю для вывода записей из бд, и удаляю вместе с формой нормально, НО бд не закрывается
PM MAIL   Вверх
nickless
Дата 2.3.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



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


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
zloyGamer
Дата 2.3.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 24.2.2008
Где: аватар какает

Репутация: нет
Всего: нет



ок
вроде разобрался,
тут точно QSqlQueryModel косячит

первый раз запускаю прогу - работает Ок, закрываю - деструкторы вызываются тож Ок 
запускаю второй раз, выдаёт следующее: 
Цитата

Unsuccessful execution caused by a system error that precludes
successful executin of subsequent statements Error opening database

тьфу блин вот что значит "дурная голова - пальцам покоя не даёт!"
вообщем сообщает что БД уже открыта, 
в процессах приложение висит :(

дурацкий QSqlQueryModel весь день с ним боролся, думал гдето с формами намудрил.
вот простой пример:
Код

#include "mtest.h"
#include <QtGui>
#include <QApplication>
#include <QSqlDatabase>
#include <QSqlError>

static bool createConnection()
{ 
  QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE");
  db.setDatabaseName( "Test_BD");
  db.setUserName    ( "SYSDBA");
  db.setPassword    ( "masterkey");
  if(!db.open()) 
  {
    QMessageBox::information(0, QObject::tr("eRRoR"),QObject::tr("connect to database\n")
                                +db.lastError().text().toAscii() );
    return 0;    
  }
  return 1;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    createConnection();
    mtest w(0);
    w.show();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}

Код

#ifndef mtest_H
#define mtest_H
#include <QtGui/QWidget>
#include "ui_mtest.h"
class QSqlQueryModel; 
class mtest : 
    public QMainWindow,
    public Ui_mtestx
{
    Q_OBJECT
  public:
    mtest(QMainWindow *parent = 0);
    ~mtest();
    void show();    
    
    QSqlQueryModel  *m;
};
#endif // mtest_H


Код

#include "mtest.h"
#include <QMessageBox>
#include <QSqlQueryModel>

mtest::mtest(QMainWindow *parent)
      :QMainWindow(parent)
{
    setupUi(this);
    m=new QSqlQueryModel();
}
void mtest::show()
{
  this->QWidget::show();
  m->setQuery("SELECT * FROM users;");
  tv->setModel(m);
}
mtest::~mtest()
{
  delete m;
  QMessageBox::information(this, "mtest::~mtest()" ,"");  
}

tv - тут - это QTableView на форме 

при закрытии формы получаю сообщение "mtest::~mtest()"
но приложение все равно висит в процессах, 
пробывал в деструкторе закрывать БД - непомогло!
незнаю что делать?

Добавлено @ 21:40
ps: использую FireBird21(embed) и qt432

Это сообщение отредактировал(а) zloyGamer - 2.3.2008, 21:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.