Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: alexeev от Октябрь 09, 2013, 16:23



Название: Отлавить закрытие виджета
Отправлено: alexeev от Октябрь 09, 2013, 16:23
Здравствуйте, у меня есть класс A, который наследуюется от Qwidget, и в нем создаются три объекта Qwidget QA,QB,QC.
В другом классе создается объект класса A. Как в этом классе отследить закрытие виджетов QA или QB.


Название: Re: Отлавить закрытие виджета
Отправлено: GreatSnake от Октябрь 09, 2013, 16:51
Код
C++ (Qt)
void QObject::destroyed ( QObject * obj = 0 ) [signal]


Название: Re: Отлавить закрытие виджета
Отправлено: alexeev от Октябрь 09, 2013, 16:54
Если не поставить такой флаг ->setAttribute( Qt::WA_DeleteOnClose ), то destroy вызван не будет, по закрытию, если я все правильно понимаю.
Но мне не нужно чтобы просходил destroy, мне сам виджет удалять не надо, надо лишь закрыть его и удалить некторые объекты.


Название: Re: Отлавить закрытие виджета
Отправлено: mutineer от Октябрь 09, 2013, 17:04
Можно через void QObject::installEventFilter ( QObject * filterObj ) установить фильтр и ловить в нем closeEvent


Название: Re: Отлавить закрытие виджета
Отправлено: GreatSnake от Октябрь 09, 2013, 17:39
Либо переопределить
Код
C++ (Qt)
bool QApplication::notify ( QObject * receiver, QEvent * e ) [virtual]

Код
C++ (Qt)
class QUApplication : public QApplication
{
Q_OBJECT
...
Q_SIGNALS:
void aboutToClose( QWidget*, bool& );
 
public:
bool notify( QObject* o, QEvent* e )
{
QWidget* w = o->isWidgetType() ? qobject_cast< QWidget* >( o ) : 0;
if( w )
{
switch( e->type() )
{
case QEvent::Close:
if( w->isVisible() && !w->parentWidget() &&
!w->windowFlags().testFlag( Qt::Dialog ) &&
w->testAttribute( Qt::WA_QuitOnClose ) )
{
bool do_close = true;
emit aboutToClose( w, do_close );
if( !do_close )
{
e->ignore();
return false;
}
}
break;
default:
break;
}
}
 
return QApplication::notify( o, e );
}
};
 


Название: Re: Отлавить закрытие виджета
Отправлено: mutineer от Октябрь 09, 2013, 17:41
Код
C++ (Qt)
bool do_close = true;
emit aboutToClose( do_close );
if( !do_close )
 

А для чего тут do_close?


Название: Re: Отлавить закрытие виджета
Отправлено: GreatSnake от Октябрь 09, 2013, 17:47
Я это у себя использовал для отлова закрытия главного окна.
Условия можно настроить под себя.
А do_close в слоте выставлялся в false, если передумали окно закрывать.


Название: Re: Отлавить закрытие виджета
Отправлено: mutineer от Октябрь 09, 2013, 17:50
То есть работает только с прямым вызовом?


Название: Re: Отлавить закрытие виджета
Отправлено: Maestro от Октябрь 09, 2013, 17:54
Но мне не нужно чтобы просходил destroy, мне сам виджет удалять не надо, надо лишь закрыть его и удалить некторые объекты.
Может быть вам нужен QWidget::hideEvent(QHideEvent * event)ж


Название: Re: Отлавить закрытие виджета
Отправлено: GreatSnake от Октябрь 10, 2013, 07:22
То есть работает только с прямым вызовом?
Да.


Название: Re: Отлавить закрытие виджета
Отправлено: alexeev от Октябрь 10, 2013, 10:36
Всем огромное спасибо!!!! Использвоал QObject::installEventFilter ( QObject * filterObj );