Reputation: 33605
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
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
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
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