2014-04-29 71 views

回答

0

您可以在對話框覆蓋eventFilter,當按逃逸管理它自己:

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

對不起,我的意思是要做到這一點,而不必重寫任何'QDialog'的方法/插槽,並且不使用事件過濾器。 –

+0

@VioletGiraffe,好的,是的,你可以修補QDialog並建立你的Qt版本。 – vahancho

0

創建基於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); 
0

如果您不想使用eventFil ter,您可以使用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); 
}