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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу отследить закрытие дочернего виджета  (Прочитано 6424 раз)
star62
Гость
« : Август 06, 2009, 19:18 »

Вопрос вот в чем, в приложении создается потомок:
class Histogram : public QWidget (простое окно)

В его конструкторе есть такие строки
Код:
setAttribute(Qt::WA_DeleteOnClose);
setWindowFlags(Qt::Dialog);

в главном приложении обрабатываю сигнал destroyed потомка

И вот сдесь самое неожиданное (для меня), получив сигнал, основное прилождение виснет. Почему, не понимаю.
Раньше был крупный проект с такой же функциональностью и все работало, здесь просто ума нериложу о причинах.

Если connect на destroyed потомка убрать, все приходит в порядок, только вот мне надо знать когда дочернее окно будет закрыто пользователем.

Помоги решить проблему.
Записан
Makss
Гость
« Ответ #1 : Август 06, 2009, 21:53 »

Поставь фильтр(eventFilter) и лови событие QEvent::Close
Записан
star62
Гость
« Ответ #2 : Август 07, 2009, 03:57 »

Поставь фильтр(eventFilter) и лови событие QEvent::Close

Спасибо, решено.

Но может кто объяснит причины поведения приложения в первоначальном варианте?
Записан
Rcus
Гость
« Ответ #3 : Август 07, 2009, 06:00 »

Но может кто объяснит причины поведения приложения в первоначальном варианте?
Интересно как там вообще обработывался этот сигнал, потому что сам по себе он не может ничего повесить, а вот если sender() преобразовывать к производному типу то вполне можно получить сегфолт, потому что destroyed() излучается в деструкторе QObject.
Записан
star62
Гость
« Ответ #4 : Август 07, 2009, 08:54 »

Интересно как там вообще обработывался этот сигнал, потому что сам по себе он не может ничего повесить, а вот если sender() преобразовывать к производному типу то вполне можно получить сегфолт, потому что destroyed() излучается в деструкторе QObject.

Обработка буквально две строки:
Код:
checkBox_ish_hist->setChecked(false);
ish_data_hist = NULL;

ish_data_hist указатель на объект который только что был уничтожен (т.к. от него пришел destroyed())
Записан
SASA
Гость
« Ответ #5 : Август 07, 2009, 19:09 »

ish_data_hist = NULL;
ish_data_hist указатель на объект который только что был уничтожен (т.к. от него пришел destroyed())
Замечание. Пользуйся QPointer.
Записан
star62
Гость
« Ответ #6 : Август 10, 2009, 05:40 »

ish_data_hist = NULL;
ish_data_hist указатель на объект который только что был уничтожен (т.к. от него пришел destroyed())
Замечание. Пользуйся QPointer.

В чем преимущество? Если не сложно крательно черкануть.
Записан
SASA
Гость
« Ответ #7 : Август 10, 2009, 11:47 »

ish_data_hist = NULL;
ish_data_hist указатель на объект который только что был уничтожен (т.к. от него пришел destroyed())
Замечание. Пользуйся QPointer.

В чем преимущество? Если не сложно крательно черкануть.
Указатель занулится автоматически при удалении объекта.
Код:
QPointer<MyObject> po = new MyObject();
...
if (po != 0)
{
// эта проверка на то, существует объект или нет,
// а не просто на значение указателя
}

В асистанте очень подробно всё расписанно.
Записан
star62
Гость
« Ответ #8 : Август 11, 2009, 04:36 »

Указатель занулится автоматически при удалении объекта.
Код:
QPointer<MyObject> po = new MyObject();
...
if (po != 0)
{
// эта проверка на то, существует объект или нет,
// а не просто на значение указателя
}


Я проверял этот функционал давненько, он у меня не сработал. Поэтому по привычке продолжал. Думаю до сего момента, теперь буду перестраиваться.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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