Как сделать так, чтобы немодальный 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);