如何通过按Esc键使非模态QDialog不可取消

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

本文关键字:模态 QDialog 不可取 可取消 何通过 Esc      更新时间:2023-10-16

当用户点击Esc时,除了重写reject()或使用事件过滤器/event方法之外,我还能阻止非模态QDialog关闭吗?如果没有,是否可以使用模态QDialog?

如果不想使用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);