Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с closeEvent
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
radislav72
Помогите с такой проблемой.

Есть дилог - потомок 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
radislav72,
читай внимательнее про QDialog
тебе вообще по идее не нужен closeEvent
нужно лишь переопределить 2 слота accept() && reject()
Litkevich Yuriy
Цитата(radislav72 @ 9.4.2010, 12:05) *
e->ignore();
QDialog::closeEvent(e);
это первое, что бросилось в глаза, даже не читая самого сообщения.
Ты либо игнорируешь событие, либо передаёшь его обработку в базовый класс.

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

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

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

попробуй ради интересу не на кнопки "Ок" "Отмена" понажимать, а на крестик закрытия окна. что получится?
radislav72
Большое спасибо за подсказки!

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

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

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

Litkevich Yuriy
Цитата(radislav72 @ 9.4.2010, 14:45) *
this->rejected();
тогда окно закроется, просто с другим кодом возврата (результата), нужно просто return делать, если хочешь, чтобы окно оставалось открытым
radislav72
Исправлю себя:
    void settlementDialog::accept()
    ...............................................
    if (!errs.isEmpty())
    {
        QMessageBox::warning(this, tr("Warning!"), errs, QMessageBox::Cancel);
    } else QDialog::accept();


Так работает хорошо вроде
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.