Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Закрытие окна крестиком или методом close


Автор: Brodyaga 8.6.2010, 10:16
Всем доброго времени суток!

Как мне отличить как было закрыто окно, по нажатию на X или вызовом метода close?

Если по нажатию на X, то вызывается событие closeEvent, где я делаю необходимые мне действия.
Если я вызываю метод close, так же вызывается событие closeEvent и делаются теже действия, хотя их нужно выполнять ТОЛЬКО при нажатии на X.
Как мне определить каким образом происходит закрытие формы, чтобы знать, выполнять необходимые мне действия или нет?
Может быть можно както перехватить нажатие именно на X ?
Или как мне закрыть окно, чтобы не вызывался метод closeEvent?

P.S.
Вариант с флагом не предлагать

Автор: borisbn 9.6.2010, 06:37
Переопредели в своём классе функцию close, в которой взводи флажок и вызывай QWidget::close(), а в closeEvent() проверяй, если флажок взведён, то делай одни действия, иначе - другие. Не забудь там же флажок опустить

Автор: Helmet 9.6.2010, 09:33
Код

bool    QEvent::spontaneous () const

Автор: Brodyaga 9.6.2010, 17:38
Цитата

Переопредели в своём классе функцию close, в которой взводи флажок и вызывай QWidget::close(), а в closeEvent() проверяй, если флажок взведён, то делай одни действия, иначе - другие. Не забудь там же флажок опустить

Спасибо, но я же просил без флага.
Цитата

P.S.
Вариант с флагом не предлагать



Цитата

bool    QEvent::spontaneous () const

И по нажатию на крестик и при вызове метода QWidget::close() - QCloseEvent::spontaneous() возвращает false :(

Автор: Helmet 9.6.2010, 23:47
Цитата(Brodyaga @  9.6.2010,  17:38 Найти цитируемый пост)
И по нажатию на крестик и при вызове метода QWidget::close() - QCloseEvent::spontaneous() возвращает false :( 

Странно. У меня (Windows XP) как раз по крестику - спонтениус, по close() - нет.
Да и дока говорит, что так должно быть
Цитата

bool QEvent::spontaneous () const

Returns true if the event originated outside the application (a system event); otherwise returns false.
The return value of this function is not defined for paint events.

Автор: Brodyaga 10.6.2010, 12:23
Цитата

Странно. У меня (Windows XP) как раз по крестику - спонтениус, по close() - нет.
Да и дока говорит, что так должно быть

Сейчас проверил... в обычной форме эта функция работает, но я использую её в перехватчике события closeEvent на MDI-форме. Там она почемуто не срабатывает :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)