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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2011, 00:31   #1
Tema_Crazzzy
Форумчанин
 
Регистрация: 29.04.2010
Сообщений: 114
По умолчанию Не могу связать диалоговое окно с [x]

Доброй ночи!

У меня возникла вот такая проблема.
Нужно связать закрытие программы кнопочкой [x] с диалоговым окном,
в котором надо поддтвердить выход.

Такое естественно не подходит.
Код:
connect(Qt::WindowCloseButtonHint,SIGNAL(clicked()),dialog,SLOT(show()));
Пытался сделать через closeEvent. Но тогда диалоговое окно появляется и при нажатии горячих клавиш, чего происходить не должно.
Пробовал mouseEvent опять же безрезультатно.

Как вы уже поняли, пишу на Qt.

Прошу совета. Заранее благодарен.
Tema_Crazzzy вне форума Ответить с цитированием
Старый 06.04.2011, 02:38   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Скопипастю из «Application Example».
Код:
 void MainWindow::closeEvent(QCloseEvent *event)
 {
     if (maybeSave()) {
         writeSettings();
         event->accept();
     } else {
         event->ignore();
     }
 }
Код:
 bool MainWindow::maybeSave()
 {
     if (textEdit->document()->isModified()) {
         QMessageBox::StandardButton ret;
         ret = QMessageBox::warning(this, tr("Application"),
                      tr("The document has been modified.\n"
                         "Do you want to save your changes?"),
                      QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
         if (ret == QMessageBox::Save)
             return save();
         else if (ret == QMessageBox::Cancel)
             return false;
     }
     return true;
 }
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 06.04.2011, 03:48   #3
Tema_Crazzzy
Форумчанин
 
Регистрация: 29.04.2010
Сообщений: 114
По умолчанию

Хехе)) Везде одни и те же примеры, но это, увы, не то что мне надо.
Я сделал вначале так:
Код:
void MainWindow::closeEvent(QCloseEvent *e){
    if (!dialog->exec()) e->setAccepted(false);
Но этот код срабатывает при любом способе закрытия программы. А мне надо чтобы диалоговое окно появлялось только при нажатии [x] в верхнем левом углу виджета.
Tema_Crazzzy вне форума Ответить с цитированием
Старый 06.04.2011, 12:27   #4
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Tema_Crazzzy Посмотреть сообщение
...
Но этот код срабатывает при любом способе закрытия программы. А мне надо чтобы диалоговое окно появлялось только при нажатии [x] в верхнем левом углу виджета.
Как программу закрываете?
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 06.04.2011, 12:37   #5
Tema_Crazzzy
Форумчанин
 
Регистрация: 29.04.2010
Сообщений: 114
По умолчанию

Цитата:
Сообщение от xwicked Посмотреть сообщение
Как программу закрываете?
Есть 3 варианта закрытия:
1) Файл->Выход + прикручен хоткей Ctrl+Q
2) Alt+F4
3) Этот самый [x], и только к нему надо прикрутить диалоговое окно.

Пробовал так:

Код:
void mouseEvent (QMouseEvent *clik){
     if(click->button()==Qt::WindowCloseButtonHint) dialog->show();
     //А потом прикручивал dialog->accept() к MainWindow.close();
Но программа завкрывалась прежде чем что-то происходило.

Может попробовать фильтр событий поставить?
Только как правильно обработать сигналы?
Tema_Crazzzy вне форума Ответить с цитированием
Старый 06.04.2011, 12:43   #6
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от Tema_Crazzzy Посмотреть сообщение
...
1) Файл->Выход ...
Содержимое слота, пожалуйста.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 06.04.2011, 13:02   #7
Tema_Crazzzy
Форумчанин
 
Регистрация: 29.04.2010
Сообщений: 114
По умолчанию

Код:
    File=new QMenu("File");
    File->addAction("Exit",this,SLOT(close()),Qt::CTRL+Qt::Key_Q);
closeEvent() у меня переопределен вот так:
Код:
void MainWindow::closeEvent(QCloseEvent *e){
    if (!dialog->exec()) e->setAccepted(false);
        else e->accept();
    }
}

Последний раз редактировалось Tema_Crazzzy; 06.04.2011 в 13:05.
Tema_Crazzzy вне форума Ответить с цитированием
Старый 06.04.2011, 13:50   #8
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Код:
    File=new QMenu("File");
    File->addAction("Exit",this,SLOT(slotExitProgram()),Qt::CTRL+Qt::Key_Q);
Код:
      void MainWindow::slotExitProgram()
      {
        exit(0);
      }
}
closeEvent - событие закрытия формы. В данном случае - это главная форма. При закрытии главной формы - закрывается программа. Чтобы избежать вызова этого события, непосредственно вызывается функция закрытия программы. 0 сигнализирует, что программа завершилась без ошибок.

Это один вариант.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 06.04.2011, 16:12   #9
Tema_Crazzzy
Форумчанин
 
Регистрация: 29.04.2010
Сообщений: 114
По умолчанию

xwicked, большое спасибо! Интересное решение)
Tema_Crazzzy вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диалоговое окно Абзац Vanya_Soltys Общие вопросы Delphi 2 12.05.2010 16:35
Диалоговое окно с 2 ячейками mephist Microsoft Office Excel 1 21.08.2009 19:22
Диалоговое окно Busine2009 Microsoft Office Word 0 01.08.2009 09:15
Диалоговое окно Михаил Юрьевич Общие вопросы Delphi 11 01.06.2009 20:31
Диалоговое окно Beggins Общие вопросы C/C++ 3 09.05.2008 05:03