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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с closeEvent  (Прочитано 4620 раз)
radislav72
Гость
« : Апрель 09, 2010, 08:02 »

Помогите с такой проблемой.

Есть дилог - потомок QDialog, создан в дизайнере QTCreatorа. В нем переопределен обработчик события closeEvent:
Код:
class settlementDialog : public QDialog {
    Q_OBJECT
public:
    settlementDialog(QWidget *parent = 0, int record_type = RT_ADD, int id = 0);
    ~settlementDialog();
protected:
    void closeEvent(QCloseEvent *e);
...............................

Реализация closeEvent такая:
Код:
void settlementDialog::closeEvent(QCloseEvent *e)
{
    QMessageBox::warning(this, "", "CloseEvent!", QMessageBox::Yes | QMessageBox::No);
    e->ignore();
    QDialog::closeEvent(e);
}

Сам диалог показывается таким образом:
Код:
    settlementDialog *sd = new settlementDialog(this, RT_ADD);
    if (sd->exec() == QDialog::Accepted)
    {
.....................
    }
    delete sd;

На диалоге есть buttonBox с кнопками ОК и Отмена. Нужно сделать так, чтобы при нажатии ОК проверялись данные формы, и если они не правильны, выдавалось сообщение и диалог не закрывался. Если нажимается Отмена- диалог закрывается по-любому.

По идее, в приведенном коде диалог не должен закрыться. Но он закрывается. И сообщение "CloseEvent!" вообще никогда не показывается. Почему? В чем ошибка?

Если делать так для MainWindow, все работает прекрасно. Уже второй день мучаюсь Улыбающийся
Записан
Павел_F.
Гость
« Ответ #1 : Апрель 09, 2010, 08:54 »

Он не закрывается
Кнопка ок зовет void QDialog::accept ()   [virtual slot]
Кнопка отмены зовет void QDialog::reject ()   [virtual slot]
Но сам close() не зовет никто и closeEvent не вызывается
Переопределяйте нужный вам слот и всего делов.
« Последнее редактирование: Апрель 09, 2010, 08:56 от Павел_F. » Записан
radislav72
Гость
« Ответ #2 : Апрель 09, 2010, 10:47 »

Спасибо за подсказки!

Все решилось очень просто Улыбающийся)
Код:
void settlementDialog::accept()
{
    if (ui->ledName->text().trimmed().isEmpty()) this->rejected(); else this->accepted();
}
В предыдущем неправильном варианте:
* лишней была строка
Код:
QDialog::closeEvent(e);
* при нажатии на стандартную кнопку закрытия окна в верх. прав. углу событие действительно возникало
Записан
radislav72
Гость
« Ответ #3 : Апрель 09, 2010, 11:45 »

Исправлю себя:
Код:
    void settlementDialog::accept()
    ...............................................
    if (!errs.isEmpty())
    {
        QMessageBox::warning(this, tr("Warning!"), errs, QMessageBox::Cancel);
    } else QDialog::accept();

Так работает хорошо вроде
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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