Как сделать так, чтобы немодальный QDialog не отменялся нажатием клавиши Esc?

Могу ли я предотвратить немодальное закрытие QDialog, когда пользователь нажимает Escкроме переопределения reject() или используя фильтр событий / event метод? Если нет, возможно ли это с модальным QDialog?

3 ответа

Если вы не хотите использовать eventFilter, вы можете использовать QShortcut для создания сочетания клавиш для Escape и вызова демонстрационного слота диалога. Это можно сделать так:

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);

    QShortcut * shortcut = new QShortcut(QKeySequence(Qt::Key_Escape),this,SLOT(show()));
    shortcut->setAutoRepeat(false);
}

Вы можете переопределить eventFilter в своем диалоге и управлять им самостоятельно, когда нажмете Escape:

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);

    this->installEventFilter(this);
}



bool MyDialog::eventFilter(QObject  *obj, QEvent * event)
{

    if((MyDialog *)obj == this && event->type()==QEvent::KeyPress && ((QKeyEvent*)event)->key() == Qt::Key_Escape )
    {
        return true;
    }
    return false;
}

Создайте класс на основе QObject для получения событий: -

class MyEvents : public QObject
{
    Q_OBJECT

    public:
        MyEvents(QObject* parent);

    protected:
        bool eventFilter(QObject *obj, QEvent *event)
        {
            if (event->type() == QEvent::KeyPress) 
            {
                QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
                if(keyEvent->key() == Qt::Key_Escape)
                    return true;
                else
                    return QObject::eventFilter(obj, event);
            } 
            else 
            {
               // standard event processing
               return QObject::eventFilter(obj, event);
            }
        }
};

Затем установите объект в качестве фильтра событий для диалога

MyEvents* myEvents = new MyEvents;

QDialog myDialog(parent);
myDialog->installEventFilter(myEvents);
Другие вопросы по тегам