Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: star62 от Август 06, 2009, 19:18



Название: Не могу отследить закрытие дочернего виджета
Отправлено: star62 от Август 06, 2009, 19:18
Вопрос вот в чем, в приложении создается потомок:
class Histogram : public QWidget (простое окно)

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

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

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

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

Помоги решить проблему.


Название: Re: Не могу отследить закрытие дочернего виджета
Отправлено: Makss от Август 06, 2009, 21:53
Поставь фильтр(eventFilter) и лови событие QEvent::Close


Название: Re: Не могу отследить закрытие дочернего виджета
Отправлено: star62 от Август 07, 2009, 03:57
Поставь фильтр(eventFilter) и лови событие QEvent::Close

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

Но может кто объяснит причины поведения приложения в первоначальном варианте?


Название: Re: Не могу отследить закрытие дочернего виджета
Отправлено: Rcus от Август 07, 2009, 06:00
Но может кто объяснит причины поведения приложения в первоначальном варианте?
Интересно как там вообще обработывался этот сигнал, потому что сам по себе он не может ничего повесить, а вот если sender() преобразовывать к производному типу то вполне можно получить сегфолт, потому что destroyed() излучается в деструкторе QObject.


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

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

ish_data_hist указатель на объект который только что был уничтожен (т.к. от него пришел destroyed())


Название: Re: Не могу отследить закрытие дочернего виджета
Отправлено: SASA от Август 07, 2009, 19:09
ish_data_hist = NULL;
ish_data_hist указатель на объект который только что был уничтожен (т.к. от него пришел destroyed())
Замечание. Пользуйся QPointer.


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

В чем преимущество? Если не сложно крательно черкануть.


Название: Re: Не могу отследить закрытие дочернего виджета
Отправлено: SASA от Август 10, 2009, 11:47
ish_data_hist = NULL;
ish_data_hist указатель на объект который только что был уничтожен (т.к. от него пришел destroyed())
Замечание. Пользуйся QPointer.

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

В асистанте очень подробно всё расписанно.


Название: Re: Не могу отследить закрытие дочернего виджета
Отправлено: star62 от Август 11, 2009, 04:36
Указатель занулится автоматически при удалении объекта.
Код:
QPointer<MyObject> po = new MyObject();
...
if (po != 0)
{
// эта проверка на то, существует объект или нет,
// а не просто на значение указателя
}


Я проверял этот функционал давненько, он у меня не сработал. Поэтому по привычке продолжал. Думаю до сего момента, теперь буду перестраиваться.