【问题标题】:How can I disable Alt + F4 window closing using Qt?如何使用 Qt 禁用 Alt + F4 窗口关闭?
【发布时间】:2012-05-09 08:02:00
【问题描述】:

我已经使用这一行从我的对话框中禁用了 Qt 中的 X 按钮:

myDialog->setWindowFlags(Qt::Dialog | Qt::Desktop)

但我无法使用以下代码检测到 Alt + F4

void myClass::keyPressEvent(QKeyEvent *e)
{
    if ((e->key()==Qt::Key_F4) && (e->modifiers()==Qt::AltModifier))
        doSomething();
}

我应该怎么做才能检测到 Alt+F4 或在 Qt 中禁用它?

【问题讨论】:

    标签: qt qt4 keypress qdialog qkeyevent


    【解决方案1】:

    按下Alt+F4 会导致关闭事件被发送到您的顶级窗口。在您的窗口类中,您可以覆盖 closeEvent() 以忽略它并阻止您的应用程序关闭。

    void MainWindow::closeEvent(QCloseEvent * event)
    {
        event->ignore();
    }
    

    如果您让关闭按钮 (X) 可见,此方法也会禁止它关闭您的应用。

    这通常用于让应用程序有机会决定是否要关闭或通过显示“您确定吗?”来询问用户。消息框。

    【讨论】:

      【解决方案2】:

      您还可以在对话框的类中处理事件(至少如果它是模态 dlg):

      void MyDialog::closeEvent(QCloseEvent* e)
      {
          if ( condition )
             e->ignore();
          else
             __super::closeEvent(e);
      }
      

      【讨论】:

        【解决方案3】:

        当按下 Alt+F4、[X] 或 Escape 时,下面的代码会阻止对话框关闭,但不是通过调用 SomeDialog::close() 方法。

        void SomeDialog::closeEvent(QCloseEvent *evt) {
            evt->setAccepted( !evt->spontaneous() );
        }   
        
        void SomeDialog::keyPressEvent(QKeyEvent *evt) {
            // must be overridden but empty if the only you need is to prevent closing by Escape
        }   
        

        祝我们所有人好运;)

        【讨论】:

        • 你有两个错误:它是keyPressEvent(QKeyEvent *evt) Press 而不是Pressed 并且类型不同。但是应用了这个修复程序......它运作良好。 :)
        • 只是覆盖 keyPressEvent(QKeyEvent *evt) 并将其留空,可能会导致其他问题,例如无法正常工作可能需要的 Enter 键行为,例如,当我们希望允许用户继续时通过单击 Enter 键。因此,在这种特定情况下,最好定义我们不想明确允许的键。或者,换句话说,最好调用 BaseWidget::keyPressEvent(evt) 其中 BaseWidget 是继承的东西(它可以是 QWidget、QDialog 等)
        猜你喜欢
        • 2010-09-06
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多