Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2020, 16:53   #1
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
Вопрос Отследить закрытие окна.

Всем привет. Есть нерабочий компонент моей программы. Помогите исправить.
Мне нужно, что если нажать на крестик или просто через панель_задач->закрыть_окно вызывался слот, в которых проходили некоторые вычисления на нужность закрытие программы.

Конструктор класса:
Код:
QObject::connect(this, &MainMenu::closeEvent, this, &MainMenu::exitProgram);
Функция MainMenu::exitProgram():
Код:
void MainMenu::exitProgram() {
    QMessageBox *question = new QMessageBox(QMessageBox::Icon::Question, "Выход из программы", "Сохранить файл перед закрытием?", QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::No | QMessageBox::StandardButton::Cancel);
    int answer = question->exec();
    if(answer == QMessageBox::StandardButton::Ok) {
        saveFile();
    }
    else if(answer == QMessageBox::StandardButton::No);
    else return;
    close();
}
Почему же не вызывается функция MainMenu::exitProgram()? Просто помогите
Мaкс вне форума Ответить с цитированием
Старый 14.03.2020, 16:56   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,329
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
if(answer == QMessageBox::StandardButton::No);
Ничего не смущает;?
Компилятор должен предупреждения выдавать.
waleri вне форума Ответить с цитированием
Старый 14.03.2020, 16:58   #3
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ничего не смущает;?
Компилятор должен предупреждения выдавать.
Что не так? Нет никаких предупреждений, а другая функция таким образом работает.
Мaкс вне форума Ответить с цитированием
Старый 14.03.2020, 17:03   #4
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Макс, просто closeEvent перегрузи
Код:
[virtual protected] void QWidget::closeEvent(QCloseEvent *event)
и не выпендривайся

вот реализация если интересно

Код:
void MainWnd::closeEvent(QCloseEvent *event)
 {
 if (QMessageBox::question(this,tr("Confirmation"),tr("Exit program?"),QMessageBox::Yes | QMessageBox::No)==QMessageBox::Yes)
  event->accept();
 else
  event->ignore();
 return;
 }
Subst вне форума Ответить с цитированием
Старый 14.03.2020, 17:04   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,329
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
а другая функция таким образом работает
А где здесь функция?
waleri вне форума Ответить с цитированием
Старый 14.03.2020, 17:05   #6
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Макс, просто closeEvent перегрузи
Да, спасибо за совет.
Цитата:
Сообщение от Subst Посмотреть сообщение
и не выпендривайся
За это отдельное спасибо
Цитата:
Сообщение от waleri Посмотреть сообщение
А где здесь функция?
В полной программе. Она не имеет отношения.
Мaкс вне форума Ответить с цитированием
Старый 14.03.2020, 17:10   #7
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
QMessageBox::StandardButton::Ok
Валерий грит следующее (см. ассистант)
enum QMessageBox::StandardButton
flags QMessageBox::StandardButtons

QMessageBox::StandardButton может принять одно из значений

QMessageBox::Ok
QMessageBox::Open
QMessageBox::Save

и т.д.

а у тебя достаточно загадочная запись получается, я с ходу даже и не соображу что компилятор должен подумать в такой ситуации.
Subst вне форума Ответить с цитированием
Старый 14.03.2020, 17:14   #8
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
а у тебя достаточно загадочная запись получается,
Я вас не понимаю. Что тут не так? Почему компилятор должен "задуматься"?
QMessageBox::StandardButton - перечисление. Элемент перечисления возвращает индекс типа int. В условии я сравниваю int с int. За что вы меня осуждаете?

Последний раз редактировалось Мaкс; 14.03.2020 в 17:18.
Мaкс вне форума Ответить с цитированием
Старый 14.03.2020, 17:22   #9
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
Я вас не понимаю. Что тут не так? Почему компилятор должен "задуматься"?
нет, действительно понимает.
Но весьма непривычно просто
Subst вне форума Ответить с цитированием
Старый 14.03.2020, 17:24   #10
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Но весьма непривычно просто
Если Вы про эту запись:
Цитата:
Сообщение от Мaкс Посмотреть сообщение
QMessageBox::StandardButton::No
То я объясню кратко сначала. No - ячейка перечисления StandardButton, а StandardButton - поле класса QMessageBox. Или что?
Мaкс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отследить закрытие окна fancybox Женя32 JavaScript, Ajax 2 29.12.2017 18:43
Отследить закрытие demon31 Win Api 36 16.12.2016 21:13
Закрытие окна 4rik Visual C++ 3 20.08.2014 17:18
Закрытие окна Vlad1698 Общие вопросы Delphi 1 09.02.2014 20:07
Отследить нажатие клавиши для отдельного окна Черничный Win Api 12 13.09.2008 20:47