Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: admsasha от Сентябрь 22, 2009, 04:55



Название: QDialog и событие hide();
Отправлено: admsasha от Сентябрь 22, 2009, 04:55
Есть модальное окно, созданное через Designer. Как сделать, чтобы при нажатии esc окно не закрывалось ?


Название: Re: QDialog и событие hide();
Отправлено: erslee от Сентябрь 22, 2009, 09:46
А если установить eventFilter и отлавливать нажатие клавиши и не пускать его дальше


Название: Re: QDialog и событие hide();
Отправлено: admsasha от Сентябрь 23, 2009, 02:51
А если установить eventFilter и отлавливать нажатие клавиши и не пускать его дальше
Сделал так
Код:
this->installEventFilter(this);

bool frm1::eventFilter(QObject *o, QEvent *e){
    if (e->type() == QEvent::Hide ){
        return 0; // пробывал return 1;
    }

    return QWidget::eventFilter(o, e);
}
Окно всё равно закрывается. Какой QEvent ловить и как не пускать дальше ?


Название: Re: QDialog и событие hide();
Отправлено: ildar от Сентябрь 23, 2009, 10:47
вот здесь есть мысли на этот счет
http://lists.trolltech.com/qt-interest/2005-04/thread00872-0.html (http://lists.trolltech.com/qt-interest/2005-04/thread00872-0.html)


Название: Re: QDialog и событие hide();
Отправлено: baka от Сентябрь 24, 2009, 09:28
Обработка нажатия на Esc в QDialog выглядит  так...

Код:
void QDialog::keyPressEvent(QKeyEvent *e)
{
    //   Calls reject() if Escape is pressed. Simulates a button
    //   click for the default button if Enter is pressed. Move focus
    //   for the arrow keys. Ignore the rest.

{some code }

        case Qt::Key_Escape:
            reject();
            break;
};

т.е. можно перекрыть keyPressEvent.
Код:
void MyDialog::keyPressEvent(QKeyEvent *e) {
        if(e->key() != Qt::Key_Escape)
                return QDialog::keyPressEvent(e);
};



Название: Re: QDialog и событие hide();
Отправлено: SABROG от Сентябрь 24, 2009, 11:51
Или перекрыть reject().


Название: Re: QDialog и событие hide();
Отправлено: admsasha от Сентябрь 24, 2009, 12:55
Спасибо за советы, сделал через eventFilter отлавливая keyPressEvent ESC


Название: Re: QDialog и событие hide();
Отправлено: Alex Custov от Сентябрь 24, 2009, 13:11
правильное решение - переопределить keyPressEvent(). Вообще-то непонятно, почему такое поведение никак не регулируется. Мне тоже надо было отключить ESC в нескольких диалогах, было бы значительно удобнее иметь стандартный метод QDialog::setCloseOnEsc() или типа того.


Название: Re: QDialog и событие hide();
Отправлено: baka от Сентябрь 24, 2009, 18:56
Может даже лучше написать DialogUtils::deprecateEsc(QDialog *);
или DialogUtils::setRejectKey(QDialog*, Qt::Key);

а в теле deprecateEsc(QDialog *) подвешивать к диалогу eventFilter
можно будет потом в других проектах использовать одной строчкой.