crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблема с closeEvent
radislav72
  опции профиля:
сообщение 9.4.2010, 8:05
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2010
Пользователь №: 1585

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Есть дилог - потомок 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, все работает прекрасно. Уже второй день мучаюсь :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 9.4.2010, 8:27
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


radislav72,
читай внимательнее про QDialog
тебе вообще по идее не нужен closeEvent
нужно лишь переопределить 2 слота accept() && reject()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.4.2010, 8:29
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(radislav72 @ 9.4.2010, 12:05) *
e->ignore();
QDialog::closeEvent(e);
это первое, что бросилось в глаза, даже не читая самого сообщения.
Ты либо игнорируешь событие, либо передаёшь его обработку в базовый класс.

Для того, чтобы событие закрытия не произошло, нужно игнорировать.

И вообще тебе этот обработчик не нужен для того, чтобы отслеживать "Ок". Нужно просто переопределить слот accept()

kwisp, опередил :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 9.4.2010, 8:29
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(radislav72 @ 9.4.2010, 9:05) *
И сообщение "CloseEvent!" вообще никогда не показывается. Почему? В чем ошибка?

попробуй ради интересу не на кнопки "Ок" "Отмена" понажимать, а на крестик закрытия окна. что получится?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
radislav72
  опции профиля:
сообщение 9.4.2010, 10:45
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2010
Пользователь №: 1585

Спасибо сказали: 0 раз(а)




Репутация:   0  


Большое спасибо за подсказки!

Все решилось очень просто :))
void settlementDialog::accept()
{
    if (ui->ledName->text().trimmed().isEmpty()) this->rejected(); else this->accepted();
}

А в предыдущем неправильном варианте:
* лишней была строка
QDialog::closeEvent(e);

* при нажатии на стандартную кнопку закрытия окна в верх. прав. углу событие действительно возникало

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.4.2010, 10:55
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(radislav72 @ 9.4.2010, 14:45) *
this->rejected();
тогда окно закроется, просто с другим кодом возврата (результата), нужно просто return делать, если хочешь, чтобы окно оставалось открытым
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
radislav72
  опции профиля:
сообщение 9.4.2010, 11:45
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.4.2010
Пользователь №: 1585

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


Так работает хорошо вроде
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 9.8.2020, 5:04