Violet Giraffe
Violet Giraffe

Reputation: 33605

How to make non-modal QDialog not cancellable by pressing Esc key?

Can I prevent non-modal QDialog from closing when the user hits Esc, other than by overriding reject() or using event filter / event method? If not, is it possible with a modal QDialog?

Upvotes: 0

Views: 998

Answers (3)

Nejat
Nejat

Reputation: 32675

If you don't want to use eventFilter, you can use QShortcut to create a keyboard shortcut for Escape and call the dialog's show slot. This can be done like:

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);
}

Upvotes: 1

TheDarkKnight
TheDarkKnight

Reputation: 27631

Create a QObject-based class to receive the events: -

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);
            }
        }
};

Then install the object as an event filter for the dialog

MyEvents* myEvents = new MyEvents;

QDialog myDialog(parent);
myDialog->installEventFilter(myEvents);

Upvotes: 0

Nejat
Nejat

Reputation: 32675

You can override eventFilter in your dialog and manage it on your own when Escape is pressed :

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;
}

Upvotes: 0

Related Questions