2012-04-23 30 views
1

我有一个QMainWindow,安装了一个打开QDialog的事件过滤器。 主窗口处理Enter键的键释放。 但是,当QDialog打开并且处于焦点状态时,按下Enter键时,主窗口也会捕获此事件。QMainWindow正在处理应该被QDialog捕获的事件

我该如何防止这种情况发生?我试图在QDialog中安装事件过滤器,重新实现keyReleaseEvent和keyPressEvent函数,更改父(当前为0),但似乎没有任何帮助...

请注意,当我更改事件过滤器在QMainWindow的,使得它处理按键代替键释放的QDialog的工作正常,但后来我得到我想要避免其他错误...

bool Window::eventFilter(QObject *, QEvent *event) { 
if (type == QEvent::KeyRelease) { 
    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 

    switch(keyEvent->key()) { 
    case Qt::Key_Enter: 
    // do something here 
    break; 
    default: 
    break; 
    } 
} 

Dialog::Dialog(unsigned int num, QWidget *parent) 
: QDialog(parent), num(_num) 
{ 
    ui.setupUi(this); 
    ui.btnOK->setEnabled(false); 

    connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(accept())); 
    connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(reject())); 

    installEventFilter(this); 
} 

bool Dialog::eventFilter(QObject *, QEvent *event) { 
return true; 
} 

提前感谢的

+0

你能在这里显示你的代码吗? – lazyhammer 2012-04-23 11:31:01

+0

我添加了代码。 – kakush 2012-04-23 11:55:15

回答

2

尝试webclectic的第一种方法,但用e->accept()代替e->ignore(),因为ignore()的行为与你想要达到的目的相反。

void MyDialog::keyReleaseEvent(QKeyEvent* e) 
{ 
    QDialog::keyReleaseEvent(e); 
    if (e->key() == Qt::Key_Enter) 
     e->accept(); 
} 

或者你也许应该尝试模态对话框?

更新:如果我们希望对话框响应Enter键释放,我们必须始终调用QDialog的实现。

+0

由于事件只会在else语句中传播,因此使用'accept'还是'ignore'并不重要。由于接收者不需要这个事件,所以应该使用'ignore'函数(代码准备就绪) – pnezis 2012-04-23 12:22:13

+2

就我所知,它确实很重要,因为QDialog :: keyReleaseEvent(e)无法控制事件分派器。它只检查返回/ esc的键码和触发器accept()/ reject()(如果必须的话),并将事件返回到发生传播的调度程序。我错了吗? – lazyhammer 2012-04-23 12:48:47

+0

Dmitriy是正确的,调用'QDialog :: keyReleaseEvent()'只是允许执行该函数的基类的实现,它与该事件是否被传播无关。否则就不需要接受/忽略功能。 – Chris 2012-04-23 18:21:35

相关问题