Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 18.11.2013
Сообщений: 33
1

Вызов деструктора

07.04.2014, 11:17. Показов 4924. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Столкнулся с такой аномалией.

Есть виджет. Есть деструктор. В деструкторе код.
При закрытии приложения - код деструктора не выполняется.
Запихнул в код вызов QMessageBox: сообщение выходит + выполняется код деструктора.
Убрал QMessageBox: код деструктора снова не работает.

Собственно, вопрос: почему деструктор так себя ведет, и какие еще есть варианты выполнения кода из виджета при закрытии приложения?

P.S. пробовал пользоваться флагом DeleteOnClose, но это приводит к падению программы из-за сигналов.
Связок сигналов и слотов очень много, поэтому дисконнектить их все в деструкторе - не очень хорошая идея.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2014, 11:17
Ответы с готовыми решениями:

SIGABRT при вызове деструктора
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include...

не вызывается слот при сигнале с деструктора
class ttt public QWidget { Q_OBJECT public: ~ttt() {emit destSig("iiii");} signals:...

Ui->playListView->isVisible() работает не правильно при вызове из деструктора
Помогите не могу разобраться ui->playListView->isVisible() работает не правильно при вызове из...

Вызов деструктора
Здравствуйте ,подскажите пожалуйста ,есть вот такой код ... При создании объекта MyClass в...

9
Автор FAQ
2732 / 1428 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
07.04.2014, 11:22 2
код покажите
0
1 / 1 / 0
Регистрация: 18.11.2013
Сообщений: 33
07.04.2014, 11:36  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
TabProgramsWidget::~TabProgramsWidget()
{ // Деструктор
 
    // Сохранение настроек ширины столбцов в ini-файл
    fSaveColumnWidth(m_ui->tablePrograms, "table_pro");
    
    // Тест-код
    gWarningMessage("123");
 
    // Удаление интерфейса
    delete m_ui;
}
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
07.04.2014, 11:37 4
Цитата Сообщение от Liername Посмотреть сообщение
Убрал QMessageBox: код деструктора снова не работает.
Откуда это известно?
0
1 / 1 / 0
Регистрация: 18.11.2013
Сообщений: 33
07.04.2014, 11:40  [ТС] 5
Если убрать gWarningMessage() то fSaveColumnWidth не выполняется.

Добавлено через 3 минуты
Суть в том, что я хочу чтобы настройки ширины столбцов в таблице сохранялись между запусками программы.
Поэтому написал функцию сохранения/загрузки настроек. Загрузку поместил в конструктор, а сохранение - в деструктор.
Вот только сохранение в деструкторе не выполняется. Решил проверить, запускается ли он вообще. Запихнул в него QMessageBox. Сообщение выскакивает... и сохранение работает... Убрал QMessageBox - снова перестало сохранять...
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
07.04.2014, 11:55 6
Вообще, как мне кажется, сохранение настроек нужно вставлять не деструктор, а в closeEvent виджета.
Таким образом настройки будут сохраняться при каждом закрытии виджета, а не только при его уничтожении.
0
1 / 1 / 0
Регистрация: 18.11.2013
Сообщений: 33
07.04.2014, 12:15  [ТС] 7
Пробовал и с CloseEvent, но оно не возникает при закрытии программы. Проверял с помощью QMessageBox().
0
187 / 172 / 38
Регистрация: 03.08.2012
Сообщений: 596
07.04.2014, 12:28 8
Цитата Сообщение от Liername Посмотреть сообщение
Пробовал и с CloseEvent, но оно не возникает при закрытии программы. Проверял с помощью QMessageBox().
Мне даже интересно глянуть на ваш closeEvent. Он возникает всегда, если все правильно написано
0
1 / 1 / 0
Регистрация: 18.11.2013
Сообщений: 33
07.04.2014, 12:46  [ТС] 9
C++
1
2
3
4
5
6
void
TabProgramsWidget::closeEvent(QCloseEvent *ev)
{
    gWarningMessage("123");
    ev->accept();
}
Сообщение не появляется

Добавлено через 3 минуты
Все. Я сам разобрался.
Добавляю обработчик в главное окно, а потом вызываю из него fSaveColumnWidth для всех соответствующих дочерних виджетов.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
07.04.2014, 15:32 10
Цитата Сообщение от alexey_rage Посмотреть сообщение
Таким образом настройки будут сохраняться при каждом закрытии виджета, а не только при его уничтожении.
Для классов-наследников не от QWidget не подойдет.
Сохранение настроек в деструкторе - нормальная практика.
0
07.04.2014, 15:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2014, 15:32
Помогаю со студенческими работами здесь

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки....

Вызов деструктора
При ручном вызове деструктора, освобождается ли память*

Вызов деструктора
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять...

Вызов деструктора
Есть написанный мною код: #include <iostream> class Foo { private: int *key; public: Foo...

Повторный вызов деструктора
{ bar b; b.~bar(); } В данном примере деструктор bar вызовется дважды. Как у уже удаленного...

Не понятный вызов деструктора
Здравствуйте. Ситуация такая, есть класс MyClass к примеру, и при таком коде: //разные инклюды...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru