Russian Qt Forum

Qt => Общие вопросы => Тема начата: abodnya от Апрель 20, 2013, 01:15



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

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

По сабжу:
Как перегрузить нажатие кнопки "крестик"?


Название: Re: Обработка кнопки "крестик"
Отправлено: Bepec от Апрель 20, 2013, 07:14
closeEvent у виджета переопределяли? Даже если закрывать из диспетчера задач, событие должно приходить (в windows).

PS и пора бы наверно добавить в профиль пользователя данные аля "версия Qt, ОС".


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 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);
}


Название: Re: Обработка кнопки "крестик"
Отправлено: Bepec от Апрель 20, 2013, 15:42
Мая ваша не понимайт.

Мессадж выскакивает над виджетом. Соответственно никакого фокуса и быть не может - единственно активная часть вашей программы - мессадж.


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 20, 2013, 16:00
Чтобы немного прояснить, прикладываю скрины:

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

http://vk.com/doc8911610_174737012?dl=b748b01bfd644b4256
http://vk.com/doc8911610_174737177?dl=b748b01bfd644b4256


Название: Re: Обработка кнопки "крестик"
Отправлено: VPS от Апрель 20, 2013, 16:41
Не помешал бы минимальный проект с проблемой...

П.С.:
На kubuntu метод closeEvent нормально отрабатывает...
Обычно при нажатии на "Cancel" в диалоге, должно отмениться запланированное действие. В Вашей же реализации окно всё-равно закроется...


Название: Re: Обработка кнопки "крестик"
Отправлено: Bepec от Апрель 20, 2013, 17:01
Научитесь выкладывать скрины не в приватные альбомы :D Это раз.

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

PS что мог я сделал, что не смог - попытался :D


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 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/

Под виндой еще не тестировал, может там такой проблемы не будет


Название: Re: Обработка кнопки "крестик"
Отправлено: kambala от Апрель 20, 2013, 18:27
вместо exit(0) нормальные люди пишут event->accept(), а при нажатии на отмену — event->ignore()


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 20, 2013, 18:33
Ну я ж пока только учусь)

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

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

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

В другом классе, который наследовал от QGraphicsView, event как параметр был.


Название: Re: Обработка кнопки "крестик"
Отправлено: Alex Custov от Апрель 20, 2013, 19:23
начни с изучения С++. При объявлении метода в классе имя параметра можно не указывать, достаточно его тип, т.е. QCloseEvent *


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 20, 2013, 19:30
примерно догадывался.
Суть в том, почему при наследовании от QGraphicsView "event" как параметр предлагается, а при наследовании от QWidget предлагается только тип класса "QCloseEvent *".


Название: Re: Обработка кнопки "крестик"
Отправлено: kambala от Апрель 20, 2013, 20:06
мог бы в документации прочитать — там имя переменной указано


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 20, 2013, 20:55
регулярно почитываю документацию за тем или иным вопросом) за всем не уследишь.
Я думаю, тема себя исчерпала.

Всем спасибо за ответы


Название: Re: Обработка кнопки "крестик"
Отправлено: _OLEGator_ от Апрель 20, 2013, 23:31
Офигеть, уже за азбукой на формы лезут - извиняюсь за свою нетерпимость по этому вопросу.
Ну как так можно, не зная основ С++ куда-то двигаться дальше на шару.
Пойду просить бОльшую зарплату, после таких вопросов на форуме ощущаешь себя более ценным специалистом))


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 21, 2013, 00:16
Естественно я чего-то могу не знать, или недопонять. Что в этом страшного?
К слову, на плюсах пишу уже около года, на кьюте около полугода. Чистый Си начал учить чуть больше года назад.


Название: Re: Обработка кнопки "крестик"
Отправлено: Alex Custov от Апрель 21, 2013, 00:48
К слову, на плюсах пишу уже около года

А стандарт читал?


Название: Re: Обработка кнопки "крестик"
Отправлено: abodnya от Апрель 21, 2013, 00:57
читал для начала статьи Александра Фенстера + по нужным вопросам форумы и мануалы.
Предпочитаю "на ходу" все подучивать, на практике