Russian Qt Forum

Qt => Общие вопросы => Тема начата: radislav72 от Апрель 09, 2010, 08:02



Название: Проблема с closeEvent
Отправлено: 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, все работает прекрасно. Уже второй день мучаюсь :)


Название: Re: Проблема с closeEvent
Отправлено: Павел_F. от Апрель 09, 2010, 08:54
Он не закрывается
Кнопка ок зовет void QDialog::accept ()   [virtual slot]
Кнопка отмены зовет void QDialog::reject ()   [virtual slot]
Но сам close() не зовет никто и closeEvent не вызывается
Переопределяйте нужный вам слот и всего делов.


Название: Re: Проблема с closeEvent
Отправлено: radislav72 от Апрель 09, 2010, 10:47
Спасибо за подсказки!

Все решилось очень просто :))
Код:
void settlementDialog::accept()
{
    if (ui->ledName->text().trimmed().isEmpty()) this->rejected(); else this->accepted();
}
В предыдущем неправильном варианте:
* лишней была строка
Код:
QDialog::closeEvent(e);
* при нажатии на стандартную кнопку закрытия окна в верх. прав. углу событие действительно возникало


Название: Re: Проблема с closeEvent
Отправлено: radislav72 от Апрель 09, 2010, 11:45
Исправлю себя:
Код:
    void settlementDialog::accept()
    ...............................................
    if (!errs.isEmpty())
    {
        QMessageBox::warning(this, tr("Warning!"), errs, QMessageBox::Cancel);
    } else QDialog::accept();

Так работает хорошо вроде