Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Naihil от Август 13, 2009, 16:24



Название: Hidden window и QCloseEvent
Отправлено: Naihil от Август 13, 2009, 16:24
Здравствуйте! Столкнулся со следующей проблемой:
Имеется главное окно QMainWindow, которое может сворачиваться в трей при минимизации. У окна установлен атрибут Qt::WA_DeleteOnClose.
Определён слот для закрытия приложения:
Код:
void AppExit()
{
  qApp->closeAllWindows();
  qApp->quit();
}
Если вызвать этот слот при развёрнутом окне - нормально вызывается деструктор главного окна и приложение завершается. Если окно свернуть в трей и из контекстного меню трея вызвать этот слот - приложение завершится, но деструктор окна не вызовется, т.к. окно не получает CloseEvent.
Посмотрел в асистанте:
Код:
bool QWidget::close ()   [slot]
First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event.
...
A close events is delivered to the widget no matter if the widget is visible or not.
...

void QWidget::hide ()   [slot]
Hides the widget. This function is equivalent to setVisible(false).
Получается, если окно уже hidden, то оно не получает CloseEvent? Но это противоречит указанному в документации по close.
Есть какое-то правильное решение, помимо вызова showNormal() перед qApp->closeAllWindows();
?


Название: Re: Hidden window и QCloseEvent
Отправлено: ритт от Август 13, 2009, 16:30
1. зачем главному окну Qt::WA_DeleteOnClose ?
2. уверен, что при вызове слота из контекстного меню трея, приложение завершается, а не крашит?


Название: Re: Hidden window и QCloseEvent
Отправлено: Naihil от Август 13, 2009, 16:53
1. зачем главному окну Qt::WA_DeleteOnClose ?
Чтобы оно удалялось при закрытии :)
Код:
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  a.setQuitOnLastWindowClosed( false );
  MainWindow* w = new MainWindow();
  w->show();
  return a.exec();
}

Цитировать
2. уверен, что при вызове слота из контекстного меню трея, приложение завершается, а не крашит?
Qt Creator говорит, что завершается:
E:\tmp\test.exe exited with code 0
Qt 4.5.1


Название: Re: Hidden window и QCloseEvent
Отправлено: spectre71 от Август 13, 2009, 17:28
1. зачем главному окну Qt::WA_DeleteOnClose ?
Чтобы оно удалялось при закрытии :)

Код
C++ (Qt)
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 a.setQuitOnLastWindowClosed( false );
 MainWindow w;
 w.show();
 return a.exec();
}

И обрабатываешь closeEvent


Название: Re: Hidden window и QCloseEvent
Отправлено: Naihil от Август 14, 2009, 08:26
1. зачем главному окну Qt::WA_DeleteOnClose ?
Чтобы оно удалялось при закрытии :)

Код
C++ (Qt)
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 a.setQuitOnLastWindowClosed( false );
 MainWindow w;
 w.show();
 return a.exec();
}

И обрабатываешь closeEvent
Можно и так, но хотелось бы понять почему в моём случае не срабатывает. Когда начал писать на Qt полистал официальную книгу и в ней одним из первых примеров был мой вариант с замечанием, что в данном примере память после закрытия не освобождается, для этого и выставляю атрибут Qt::WA_DeleteOnClose.
Вопрос-то собственно не в этом, а в том почему hidden окно не получает QCloseEvent  ???

UPD
Переписал как предложил Spectre, при вызове AppExit() из трея деструктор MainWindow начал вызываться, а вот QCloseEvent как не было, так и нет :-/


Название: Re: Hidden window и QCloseEvent
Отправлено: ритт от Август 14, 2009, 17:44
тогда тебе сюда: http://qt.nokia.com/bugreport-form
опиши проблему и приложи свой test-case. а когда ответят, поделишься ответом здесь )


Название: Re: Hidden window и QCloseEvent
Отправлено: Naihil от Август 24, 2009, 09:41
тогда тебе сюда: http://qt.nokia.com/bugreport-form
опиши проблему и приложи свой test-case. а когда ответят, поделишься ответом здесь )
Вернулся из недельного отпуска, как будет время обновлю версию Qt и попробую в винде и линуксе...если останется без изменений, то попробую оформить тикет :)