Russian Qt Forum
Ноябрь 24, 2024, 23:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: closeEvent  (Прочитано 23529 раз)
17dufa
Гость
« : Август 15, 2007, 12:49 »

Qt 4.2.2 + VS2005
Мне нужно перехватить закрытие окна. Попробовал переопределить closeEvent. Если пользователь выходит по кнопоче "Закрыть" все срабатывает, а вот при нажатии крестика - нет. Как быть?
Записан
-=QT=-
Гость
« Ответ #1 : Август 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();

}
Записан
den'ka
Гость
« Ответ #2 : Август 15, 2007, 13:25 »

Странно. У меня вот так:

void Widget::closeEvent(QCloseEvent * e){
   e->ignore();
}

окошко не хотит закрываться... Следовательно и event ловиться.
Записан
-=QT=-
Гость
« Ответ #3 : Август 15, 2007, 13:44 »

Тот код который я привел.
Реально работает у меня в приложениях. Я копировал из рабочей проги. Улыбающийся
Записан
17dufa
Гость
« Ответ #4 : Август 15, 2007, 13:45 »

несмотря на убедительность Ваших всказываний моя программка не хочет работать. Если кнопочка "закрыть" - closeEvent отрабатывает, если нажат крестик на формочке - нет. По кнопочке "закрыть" вызывается QDialog::Close().
Записан
-=QT=-
Гость
« Ответ #5 : Август 15, 2007, 13:56 »

А кусочек кода не покажите, как это выглядит у Вас.
Записан
17dufa
Гость
« Ответ #6 : Август 15, 2007, 14:11 »

Код:

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

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


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

 или такой вопрос, можно как-нить спрятать этот несчатный крестик, пусть юзер по кнопочке выходит?
Записан
-=QT=-
Гость
« Ответ #7 : Август 15, 2007, 14:16 »

а где :
Код:
ev->ccept ();
ev->ignore();
Записан
Gryz
Гость
« Ответ #8 : Август 15, 2007, 14:16 »

А зачем эта строка: QWidget::closeEvent( ev );  Непонимающий
Записан
17dufa
Гость
« Ответ #9 : Август 15, 2007, 14:23 »

а надо?) я ж не знал. ща добавлю, вот только вряд ли это решит "проблему крестика")
если прятать крестик, надо еще и alt+F4 запрещать.

добавлено спустя 51 секунду:

 хорошо, я и эту строчку убью, просто учили меня вызывать переопределенные функции.
Записан
den'ka
Гость
« Ответ #10 : Август 15, 2007, 14:23 »

Спрятать можно если использовать setWindowFlags( Qt::Window | Qt::WindowTitleHint ) ( см примеры examples\widgets\windowflags ) или передать флаг в конструктор при создании объекта.
Записан
17dufa
Гость
« Ответ #11 : Август 15, 2007, 14:26 »

alt+F4 запретить - это придется сообщения клавы перехватывать?
Записан
den'ka
Гость
« Ответ #12 : Август 15, 2007, 18:13 »

Это прийдеться переопределить bool QCoreApplication::winEventFilter( MSG * msg, long * result ) и там уже ловить Alt+F4
Записан
QCasper
Гость
« Ответ #13 : Август 16, 2007, 08:18 »

Цитата: "17dufa"
хорошо, я и эту строчку убью, просто учили меня вызывать переопределенные функции.


Кто, интересно, этому учил вас?
Записан
17dufa
Гость
« Ответ #14 : Август 17, 2007, 11:40 »

Все оказалось опять же интересно: я переопределял closeEvent у не того класса: проект сделан таким образом, что есть диалог, а есть то, что на нем "живет", я пытался переопределить у класса, который отображался на диалоге, переопределил у класса диалога - и все заработало.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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