crossplatform.ru

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


  Ответ в Проблема с closeEvent
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
radislav72 Дата 9.4.2010, 11:45
  Исправлю себя:
    void settlementDialog::accept()
    ...............................................
    if (!errs.isEmpty())
    {
        QMessageBox::warning(this, tr("Warning!"), errs, QMessageBox::Cancel);
    } else QDialog::accept();


Так работает хорошо вроде
Litkevich Yuriy Дата 9.4.2010, 10:55
 
Цитата(radislav72 @ 9.4.2010, 14:45) *
this->rejected();
тогда окно закроется, просто с другим кодом возврата (результата), нужно просто return делать, если хочешь, чтобы окно оставалось открытым
radislav72 Дата 9.4.2010, 10:45
  Большое спасибо за подсказки!

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

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

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

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

попробуй ради интересу не на кнопки "Ок" "Отмена" понажимать, а на крестик закрытия окна. что получится?
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:27
  radislav72,
читай внимательнее про QDialog
тебе вообще по идее не нужен closeEvent
нужно лишь переопределить 2 слота accept() && reject()
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, все работает прекрасно. Уже второй день мучаюсь :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 18.4.2024, 16:58