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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Обработка кнопки "крестик"  (Прочитано 18280 раз)
abodnya
Гость
« : Апрель 20, 2013, 01:15 »

Вступление:
пишу ImageViewer с функциями редактирования. При редактировании устанавливаю флаг, что изображение было отредактировано. Соответственно при переходе к другой картинке выдаю MessageBox о том, что "файл отредактирован, сохранить изменения или нет?". Также сделал в меню пункт "Выйти" при нажатии по которому запускается функция close() главного окна, которую я перегрузил, добавив туда проверку флага "редактировано/не редактировано".

Проблема:
При нажатии в меню пункта "выйти" функция close() нормально отрабатывает.
Но если выходить нажимая "крестик", то close() игнорируется и программа моментально закрывается не сохранив изменений.

По сабжу:
Как перегрузить нажатие кнопки "крестик"?
Записан
Bepec
Гость
« Ответ #1 : Апрель 20, 2013, 07:14 »

closeEvent у виджета переопределяли? Даже если закрывать из диспетчера задач, событие должно приходить (в windows).

PS и пора бы наверно добавить в профиль пользователя данные аля "версия Qt, ОС".
Записан
abodnya
Гость
« Ответ #2 : Апрель 20, 2013, 15:17 »

Спасибо. Это помогло.
Теперь другой вопрос. Посл нажатия "крестика" фокус не попадает на MessageBox. Как заставить его при выходе передавать фокус MessageBox-у?

Код:
void QImageViewer::closeEvent(QCloseEvent *)
{
    if (!imagewidget->isSaved())
    {
        int r = QMessageBox::warning(this, tr("Внимание!"),
                                        tr("Этот файл был изменен\n"
                                           "Сохранить изменения?"),
                                        QMessageBox::No,
                                        QMessageBox::Yes | QMessageBox::Default,
                                        QMessageBox::Cancel | QMessageBox::Escape);
        if (r == QMessageBox::Cancel) return;
        if (r == QMessageBox::Yes) imagewidget->saveimage(imagewidget->currentImageName());
    }
    exit(0);
}
Записан
Bepec
Гость
« Ответ #3 : Апрель 20, 2013, 15:42 »

Мая ваша не понимайт.

Мессадж выскакивает над виджетом. Соответственно никакого фокуса и быть не может - единственно активная часть вашей программы - мессадж.
Записан
abodnya
Гость
« Ответ #4 : Апрель 20, 2013, 16:00 »

Чтобы немного прояснить, прикладываю скрины:

1) Закрытие окна пунктом меню. Фокус передался MessageBox
2) Закрытие окна "крестиком". Фокус пропал. Убунта говорит, что фокус на рабочем столе сейчас

http://vk.com/doc8911610_174737012?dl=b748b01bfd644b4256
http://vk.com/doc8911610_174737177?dl=b748b01bfd644b4256
« Последнее редактирование: Апрель 20, 2013, 16:02 от abodnya » Записан
VPS
Гость
« Ответ #5 : Апрель 20, 2013, 16:41 »

Не помешал бы минимальный проект с проблемой...

П.С.:
На kubuntu метод closeEvent нормально отрабатывает...
Обычно при нажатии на "Cancel" в диалоге, должно отмениться запланированное действие. В Вашей же реализации окно всё-равно закроется...
« Последнее редактирование: Апрель 20, 2013, 16:46 от vps » Записан
Bepec
Гость
« Ответ #6 : Апрель 20, 2013, 17:01 »

Научитесь выкладывать скрины не в приватные альбомы Веселый Это раз.

Во вторых, я работаю с виндой и по поводу убунты-кубунты ничем помочь не могу. Возможно это работа вашего оконного менеджера, а не программы.

PS что мог я сделал, что не смог - попытался Веселый
Записан
abodnya
Гость
« Ответ #7 : Апрель 20, 2013, 18:16 »

Упс )
Вот, перезалил:
http://i48.fastpic.ru/big/2013/0420/d7/6c3fa6f1935df039f9a1df74c37babd7.png
http://i48.fastpic.ru/big/2013/0420/95/fe8321ecd632bf3cd5aa34e4a6a82895.png

Сам проект слил сюда:
http://us.ua/1098015/

Под виндой еще не тестировал, может там такой проблемы не будет
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Апрель 20, 2013, 18:27 »

вместо exit(0) нормальные люди пишут event->accept(), а при нажатии на отмену — event->ignore()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
abodnya
Гость
« Ответ #9 : Апрель 20, 2013, 18:33 »

Ну я ж пока только учусь)

Кстати говоря, если перегружать closeEvent (аналогично пробывал и paintEvent) в теле класса производного, от QWidget, event-а нету в параметрах =(.

Т.е. функция принимает вид
void QImageViewer::closeEvent(QCloseEvent *)

Подскажите как правильно перегрузить так, чтоб event был.

В другом классе, который наследовал от QGraphicsView, event как параметр был.
« Последнее редактирование: Апрель 20, 2013, 18:36 от abodnya » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Апрель 20, 2013, 19:23 »

начни с изучения С++. При объявлении метода в классе имя параметра можно не указывать, достаточно его тип, т.е. QCloseEvent *
« Последнее редактирование: Апрель 20, 2013, 21:06 от Alex Custov » Записан
abodnya
Гость
« Ответ #11 : Апрель 20, 2013, 19:30 »

примерно догадывался.
Суть в том, почему при наследовании от QGraphicsView "event" как параметр предлагается, а при наследовании от QWidget предлагается только тип класса "QCloseEvent *".
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Апрель 20, 2013, 20:06 »

мог бы в документации прочитать — там имя переменной указано
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
abodnya
Гость
« Ответ #13 : Апрель 20, 2013, 20:55 »

регулярно почитываю документацию за тем или иным вопросом) за всем не уследишь.
Я думаю, тема себя исчерпала.

Всем спасибо за ответы
Записан
_OLEGator_
Гость
« Ответ #14 : Апрель 20, 2013, 23:31 »

Офигеть, уже за азбукой на формы лезут - извиняюсь за свою нетерпимость по этому вопросу.
Ну как так можно, не зная основ С++ куда-то двигаться дальше на шару.
Пойду просить бОльшую зарплату, после таких вопросов на форуме ощущаешь себя более ценным специалистом))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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