Russian Qt Forum
Июнь 05, 2024, 10:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Hidden window и QCloseEvent  (Прочитано 6630 раз)
Naihil
Новичок

Offline Offline

Сообщений: 23


Просмотр профиля
« : Август 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();
?
Записан
ритт
Гость
« Ответ #1 : Август 13, 2009, 16:30 »

1. зачем главному окну Qt::WA_DeleteOnClose ?
2. уверен, что при вызове слота из контекстного меню трея, приложение завершается, а не крашит?
Записан
Naihil
Новичок

Offline Offline

Сообщений: 23


Просмотр профиля
« Ответ #2 : Август 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
Записан
spectre71
Гость
« Ответ #3 : Август 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
Записан
Naihil
Новичок

Offline Offline

Сообщений: 23


Просмотр профиля
« Ответ #4 : Август 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 как не было, так и нет :-/
« Последнее редактирование: Август 14, 2009, 09:31 от Naihil » Записан
ритт
Гость
« Ответ #5 : Август 14, 2009, 17:44 »

тогда тебе сюда: http://qt.nokia.com/bugreport-form
опиши проблему и приложи свой test-case. а когда ответят, поделишься ответом здесь )
Записан
Naihil
Новичок

Offline Offline

Сообщений: 23


Просмотр профиля
« Ответ #6 : Август 24, 2009, 09:41 »

тогда тебе сюда: http://qt.nokia.com/bugreport-form
опиши проблему и приложи свой test-case. а когда ответят, поделишься ответом здесь )
Вернулся из недельного отпуска, как будет время обновлю версию Qt и попробую в винде и линуксе...если останется без изменений, то попробую оформить тикет Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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