Russian Qt Forum

Qt => Общие вопросы => Тема начата: 17dufa от Август 15, 2007, 12:49



Название: 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
Код:

class A : QWidget
{
...
protected:
void closeEvent( QCloseEvent *);
}

void A::closeEvent( QCloseEvent * ev )
{
MessageBox( NULL, "close", "", 0 );
QWidget::closeEvent( ev );
}


добавлено спустя 6 минут:

 или такой вопрос, можно как-нить спрятать этот несчатный крестик, пусть юзер по кнопочке выходит?


Название: closeEvent
Отправлено: -=QT=- от Август 15, 2007, 14:16
а где :
Код:
ev->ccept ();
ev->ignore();


Название: 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.