Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление класса диалога в Qt  (Прочитано 9628 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« : 05-03-2009 19:11 » 

Есть главная форма, на ней кнопка, при нажатии на которую появляется экземпляр диалога. Диалоги не модальные и можно их создать любое количество.
Вот обработчик той самой кнопки:
Код:
void DLG_main::showSotrudSprDlg() {   
    DLG_sotrud_spr *sotrudDlg = new DLG_sotrud_spr(this);
    sotrudDlg->show();
}
В документации по Qt написано, что нельзя самостоятельно удалять созданные экземпляры классов если они унаследованы от QObject, т.к. Qt сама заботится об освобождении памяти. Что же получается на практике, при создании диалогов им передается указатель на класс главного диалога и при закрытии дочерних диалогов их классы не удаляются, а удаляются только тогда когда будет закрыто главное окно. Но раз при каждом вызове создаётся новый экземпляр класса и не удаляется старый при закрытии дочерних диалогов происходит утечка памяти.... каким образом можно это все побороть? Улыбаюсь
Записан

Любимая игрушка - debugger ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-03-2009 19:34 » 

RuNTiME, удалять нужно через delete - это самые обыкновенные объекты.

Есть альтернатива:
http://doc.trolltech.com/4.5/qwidget.html#close

Цитата
bool QWidget::close ()   [slot]

Closes this widget. Returns true if the widget was closed; otherwise returns false.

First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event. If it ignores the event, nothing happens. The default implementation of QWidget::closeEvent() accepts the close event.

If the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.

The QApplication::lastWindowClosed() signal is emitted when the last visible primary window (i.e. window with no parent) with the Qt::WA_QuitOnClose attribute set is closed. By default this attribute is set for all widgets except transient windows such as splash screens, tool windows, and popup menus.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 05-03-2009 20:36 » 

RXL,  спасибо, все получилось!
Записан

Любимая игрушка - debugger ...
alliance
Постоялец

ru
Offline Offline

« Ответ #3 : 15-04-2009 19:41 » 

Есть проблема, пишу программу, строющую простую, абстрактную топологию компьютерной сети с обходом сети , сортировкой и т п. за свичи я взял свой класс, унаследованный от QPushButton, но если во время исполнения удалить мой объект , программа выдает ошибку . Я испробовал  и delete, и deletelater, и наследование от главного виджета, не могу понять, в чём ошибка
вот куски кода :
Код:
Button* Local::create_button(Button* prev)//создание кнопки
{

    Button* pcmd= new Button(prev);
    pcmd->setIcon(pcmd->pix);
    pcmd->set_nm(tru.cols);
    butt<<pcmd;                        //добавляем указатель на созданную кнопку в список
    pcmd->setFixedSize(40,40);
    connect(pcmd,SIGNAL(clicked()),SLOT(slotButtonClicked()));
    connect(pcmd,SIGNAL(RichButtonClicked()),SLOT(slotRichButtonClicked()));
    return pcmd;
}

Код:
void Local::slotButtonClicked()//слот обработки сигнала
{
...
if(ustlocal==rue)
{
 Button* buf=create_button(((Button*)sender()));
...
}
if(delllocal==true)
{
butt[i]->deleteLater();
}
pereust_layout();
update();
}

Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 15-04-2009 20:51 » 

Какую именно ошибку выдает? Что именно пишет в консоле? Я так понял у тебя 3 Qt?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 16-04-2009 11:33 » 

alliance, ты создаешь объекты Button и передаешь в качестве родителя объект ((Button*)sender()), при удалении этого объекта, Qt АВТОМАТИЧЕСКИ удаляет твои классы. К тому же ты удаляешь объекты спомощю deleteLater(), что инициирует удаление объектов, после удаления класса ((Button*)sender()) и твоих производных Button. Т.е. говоря простым языком, ты пытаешься удалить уже удаленные объекты, отсюда и ошибка. Вообще, в Qt документации, написано, что самостоятельное управление памятю (точнее её освобождение) является ошибкой и советуют все Qt классы создавать через new с указанием базового класса, при удалении которого произойдет автоматическое освобождение памяти выделенной под производные классы.
Записан

Любимая игрушка - debugger ...
alliance
Постоялец

ru
Offline Offline

« Ответ #6 : 16-04-2009 12:39 » 

Я работаю в qt 4.5, под висту ). Выдает, что моя программа выполнила недопустимую ошибку и будет закрыта. В консоле пишет C:/qr/local_host/AK_inc.exe exited with code 255.
Спасибо попробую исправить, я пробовал и через delete удалять та же ошибка.
« Последнее редактирование: 16-04-2009 14:03 от alliance » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines