簡體   English   中英

如何通過按Esc鍵使非模式QDialog不可取消?

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

我可以防止非模式QDialog在用戶點擊Esc時關閉,而不是通過覆蓋reject()或使用事件過濾器/ event方法來關閉? 如果不是,是否可以使用模式QDialog?

如果不想使用eventFilter,則可以使用QShortcut為Escape創建鍵盤快捷鍵,並調用對話框的show slot。 可以這樣完成:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM