Автор: radislav72 9.4.2010, 8:05
Помогите с такой проблемой.
Есть дилог - потомок 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
radislav72,
читай внимательнее про QDialog
тебе вообще по идее не нужен closeEvent
нужно лишь переопределить 2 слота accept() && reject()
Автор: Litkevich Yuriy 9.4.2010, 8:29
Цитата(radislav72 @ 9.4.2010, 12:05)
e->ignore();
QDialog::closeEvent(e);
это первое, что бросилось в глаза, даже не читая самого сообщения.
Ты либо игнорируешь событие, либо передаёшь его обработку в базовый класс.
Для того, чтобы событие закрытия не произошло, нужно игнорировать.
И вообще тебе этот обработчик не нужен для того, чтобы отслеживать "Ок". Нужно просто переопределить слот accept()
kwisp, опередил
Автор: kwisp 9.4.2010, 8:29
Цитата(radislav72 @ 9.4.2010, 9:05)
И сообщение "CloseEvent!" вообще никогда не показывается. Почему? В чем ошибка?
попробуй ради интересу не на кнопки "Ок" "Отмена" понажимать, а на крестик закрытия окна. что получится?
Автор: radislav72 9.4.2010, 10:45
Большое спасибо за подсказки!
Все решилось очень просто )
void settlementDialog::accept()
{
if (ui->ledName->text().trimmed().isEmpty()) this->rejected(); else this->accepted();
}
А в предыдущем неправильном варианте:
* лишней была строка
QDialog::closeEvent(e);
* при нажатии на стандартную кнопку закрытия окна в верх. прав. углу событие действительно возникало
Автор: Litkevich Yuriy 9.4.2010, 10:55
Цитата(radislav72 @ 9.4.2010, 14:45)
this->rejected();
тогда окно закроется, просто с другим кодом возврата (результата), нужно просто
return делать, если хочешь, чтобы окно оставалось открытым
Автор: radislav72 9.4.2010, 11:45
Исправлю себя:
void settlementDialog::accept()
...............................................
if (!errs.isEmpty())
{
QMessageBox::warning(this, tr("Warning!"), errs, QMessageBox::Cancel);
} else QDialog::accept();
Так работает хорошо вроде