zoukankan      html  css  js  c++  java
  • Qt按ESC关闭模态对话框不触发closeEvent()问题解析(ESC默认调用的是reject()函数,所以必须覆盖这个函数才会有效果)good

          事情是这样的:今天调试窗体,突然发现按ESC键居然跳过closeEvent()关闭了对话框!我的关闭判断都在closeEvent()里,这直接导致非正常关闭了正在进行的工作。先重建下场景:

    调用处:

    {
    
        Corpus corpusDialog(this);
    
        corpusDialog.exec();
    
    }

    典型的模态对话框,因为用了exec()。Corpus对话框类中覆盖了closeEvent(),其中父类的closeEvent()为虚函数。这样,当我按ESC关闭对话框就出现了如题情景。

    后来发现,居然是因为Corpus类中没有覆盖reject()函数导致的!由Qt官方文档:

    Escape Key

    If the user presses the Esc key in a dialog, QDialog::reject() will be called. This will cause the window to close: The close event cannot be ignored.

    得知按ESC默认调用的是reject()函数。由于Corpus类中没有覆盖,直接调用了父类QDialog的reject()。调用QDialog的reject()会发生什么呢?

    它实际调用了done(QDialog::Reject)(同样由于没有被覆盖,调用的是QDialog的done)。由Qt官方文档:

    void QDialog::done ( int r )  [virtual slot]

    Closes the dialog and sets its result code to r. If this dialog is shown withexec(), done() causes the local event loop to finish, and exec() to return r.

    看不出done()到底做了些什么。调试跟踪了一圈,发现就我这种情况来讲

    • done(QDialog::Reject)仅hide了对话框,
    • 然后设置了exec()返回值为QDialog::Reject,
    • 关闭窗体事件循环(这个看不出,估计的),
    • 释放finished(QDialog::Reject)信号,
    • 最后释放rejected()信号。

          的却没有关闭窗体呀,所以也不会触发closeEvent()。我应当在Corpus类中覆盖掉reject(),由reject()调用close()。这样就把问题解决了!

    void Corpus::reject()
    
    {
    
        close();
    
    }
     
     
    http://www.cnblogs.com/codingmylife/archive/2010/04/29/1724571.html
  • 相关阅读:
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    Java实现One-way traffic(单向交通)
    C#调用Delphi Dll返回字符串的示例(使用Move才能拷贝字符串)
    Delphi实现菜单项上出现提示
    WebBrowser中获得脚本中的变量值
    比较两个文件是否相同(比较两个流是否相等)
    WebBrowser执行脚本和调用外部方法
    c#之函数创建和闭包
  • 原文地址:https://www.cnblogs.com/findumars/p/5876883.html
Copyright © 2011-2022 走看看