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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отлавить закрытие виджета  (Прочитано 5150 раз)
alexeev
Гость
« : Октябрь 09, 2013, 16:23 »

Здравствуйте, у меня есть класс A, который наследуюется от Qwidget, и в нем создаются три объекта Qwidget QA,QB,QC.
В другом классе создается объект класса A. Как в этом классе отследить закрытие виджетов QA или QB.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Октябрь 09, 2013, 16:51 »

Код
C++ (Qt)
void QObject::destroyed ( QObject * obj = 0 ) [signal]
Записан

Qt 5.11/4.8.7 (X11/Win)
alexeev
Гость
« Ответ #2 : Октябрь 09, 2013, 16:54 »

Если не поставить такой флаг ->setAttribute( Qt::WA_DeleteOnClose ), то destroy вызван не будет, по закрытию, если я все правильно понимаю.
Но мне не нужно чтобы просходил destroy, мне сам виджет удалять не надо, надо лишь закрыть его и удалить некторые объекты.
Записан
mutineer
Гость
« Ответ #3 : Октябрь 09, 2013, 17:04 »

Можно через void QObject::installEventFilter ( QObject * filterObj ) установить фильтр и ловить в нем closeEvent
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Октябрь 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 );
}
};
 
« Последнее редактирование: Октябрь 09, 2013, 17:42 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
mutineer
Гость
« Ответ #5 : Октябрь 09, 2013, 17:41 »

Код
C++ (Qt)
bool do_close = true;
emit aboutToClose( do_close );
if( !do_close )
 

А для чего тут do_close?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Октябрь 09, 2013, 17:47 »

Я это у себя использовал для отлова закрытия главного окна.
Условия можно настроить под себя.
А do_close в слоте выставлялся в false, если передумали окно закрывать.
Записан

Qt 5.11/4.8.7 (X11/Win)
mutineer
Гость
« Ответ #7 : Октябрь 09, 2013, 17:50 »

То есть работает только с прямым вызовом?
Записан
Maestro
Гость
« Ответ #8 : Октябрь 09, 2013, 17:54 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Октябрь 10, 2013, 07:22 »

То есть работает только с прямым вызовом?
Да.
Записан

Qt 5.11/4.8.7 (X11/Win)
alexeev
Гость
« Ответ #10 : Октябрь 10, 2013, 10:36 »

Всем огромное спасибо!!!! Использвоал QObject::installEventFilter ( QObject * filterObj );
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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