Название: closeEvent Отправлено: 17dufa от Август 15, 2007, 12:49 Qt 4.2.2 + VS2005
Мне нужно перехватить закрытие окна. Попробовал переопределить closeEvent. Если пользователь выходит по кнопоче "Закрыть" все срабатывает, а вот при нажатии крестика - нет. Как быть? Название: closeEvent Отправлено: -=QT=- от Август 15, 2007, 13:23 #include <QMouseEvent>
........... void closeEvent(QCloseEvent *event); /* Перехват сообщения закрытия программы */ ......... void MainWindowImpl::closeEvent(QCloseEvent *event) { QMessageBox::StandardButton ret; ret = QMessageBox::question( this, QApplication::applicationName(), tr(" Do you want to close programm ? "), QMessageBox::Yes | QMessageBox::No , QMessageBox::No ); if (ret == QMessageBox::No) event->ignore(); } Название: closeEvent Отправлено: den'ka от Август 15, 2007, 13:25 Странно. У меня вот так:
void Widget::closeEvent(QCloseEvent * e){ e->ignore(); } окошко не хотит закрываться... Следовательно и event ловиться. Название: closeEvent Отправлено: -=QT=- от Август 15, 2007, 13:44 Тот код который я привел.
Реально работает у меня в приложениях. Я копировал из рабочей проги. :) Название: closeEvent Отправлено: 17dufa от Август 15, 2007, 13:45 несмотря на убедительность Ваших всказываний моя программка не хочет работать. Если кнопочка "закрыть" - closeEvent отрабатывает, если нажат крестик на формочке - нет. По кнопочке "закрыть" вызывается QDialog::Close().
Название: closeEvent Отправлено: -=QT=- от Август 15, 2007, 13:56 А кусочек кода не покажите, как это выглядит у Вас.
Название: closeEvent Отправлено: 17dufa от Август 15, 2007, 14:11 Код:
добавлено спустя 6 минут: или такой вопрос, можно как-нить спрятать этот несчатный крестик, пусть юзер по кнопочке выходит? Название: closeEvent Отправлено: -=QT=- от Август 15, 2007, 14:16 а где :
Код: ev->ccept (); Название: closeEvent Отправлено: Gryz от Август 15, 2007, 14:16 А зачем эта строка: QWidget::closeEvent( ev ); ???
Название: closeEvent Отправлено: 17dufa от Август 15, 2007, 14:23 а надо?) я ж не знал. ща добавлю, вот только вряд ли это решит "проблему крестика")
если прятать крестик, надо еще и alt+F4 запрещать. добавлено спустя 51 секунду: хорошо, я и эту строчку убью, просто учили меня вызывать переопределенные функции. Название: closeEvent Отправлено: den'ka от Август 15, 2007, 14:23 Спрятать можно если использовать setWindowFlags( Qt::Window | Qt::WindowTitleHint ) ( см примеры examples\widgets\windowflags ) или передать флаг в конструктор при создании объекта.
Название: closeEvent Отправлено: 17dufa от Август 15, 2007, 14:26 alt+F4 запретить - это придется сообщения клавы перехватывать?
Название: closeEvent Отправлено: den'ka от Август 15, 2007, 18:13 Это прийдеться переопределить bool QCoreApplication::winEventFilter( MSG * msg, long * result ) и там уже ловить Alt+F4
Название: closeEvent Отправлено: QCasper от Август 16, 2007, 08:18 Цитата: "17dufa" хорошо, я и эту строчку убью, просто учили меня вызывать переопределенные функции. Кто, интересно, этому учил вас? Название: closeEvent Отправлено: 17dufa от Август 17, 2007, 11:40 Все оказалось опять же интересно: я переопределял closeEvent у не того класса: проект сделан таким образом, что есть диалог, а есть то, что на нем "живет", я пытался переопределить у класса, который отображался на диалоге, переопределил у класса диалога - и все заработало.
Название: closeEvent Отправлено: VZ от Август 17, 2007, 17:15 Цитата: "17dufa" Все оказалось опять же интересно: я переопределял closeEvent у не того класса: проект сделан таким образом, что есть диалог, а есть то, что на нем "живет", я пытался переопределить у класса, который отображался на диалоге, переопределил у класса диалога - и все заработало. А! так это диалог? а чем не катят слоты QDialog::reject(), QDialog::done(int r) ? Или полвинды переписать романтичнее? :lol: Название: Re: closeEvent Отправлено: pastor от Январь 13, 2008, 19:44 А зачем эта строка: QWidget::closeEvent( ev ); ??? Эта строка нужна в некоторые ситуациях, когда идет самостоятельная обработка эвента. Без вызова метода closeEvent базового класса возможна неправильная работа. Например я таслкнулся с такой ситуацией при переопределении closeEvent в QMdiSubWindow. Поведение проги было странным. Вот что написали троли по этому поводу: Цитировать The problem in your code was that you are reimplementing the closeEvent() method for your MdiChild class and not calling the base class , QMdiSubWindow::closeEvent( event ). The closeEvent() method implemantion of QMdiSubWindow invokes a few other function calls such as d->setActive(false); for making the subwindow not active. Hence, calling the base class when accepting the event in the closeEvent() implementation should work. However, it is recommended that you implement the closeEvent() method of the widget that you are about set in a subwindow for intercepting the QEvent::Close event and not closeEvent() of the subwindow itself, as written in our example basically. |