【问题标题】:How to pass keyPressEvent in Qt to base class?如何将 Qt 中的 keyPressEvent 传递给基类?
【发布时间】:2015-01-21 17:36:30
【问题描述】:

QWidget::keyPressEvent 方法的 Qt 文档说:

如果您重新实现此处理程序,那么在您不对键执行操作的情况下调用基类实现非常重要。

但是,我不确定使用什么代码来确保按键被传递到行中的下一个对象来处理它。我有一个函数void MainWindow::keyPressEvent(QKeyEvent *k)。如果我“不按键操作”,我应该在方法中添加什么?

【问题讨论】:

    标签: c++ qt keypress


    【解决方案1】:

    如果您重新实现此处理程序,那么如果您不对键进行操作,那么调用基类实现非常重要。

    在 C++ 中,如果要调用基类方法,请使用 :: 范围运算符来执行此操作。如果要推迟到基类的实现,只需写:

    return QWidget::keyPressEvent(k);
    

    这就是“调用基类实现”的意思。

    【讨论】:

      【解决方案2】:

      更新:修正错字,修复无限循环。

      主窗口.h

      #include <QMainWindow>
      #include <QKeyEvent>
      
      class MainWindow : public QMainWindow
      {
          Q_OBJECT
      public:
          MainWindow(QWidget * parent = 0);
          ~MainWindow();
      public slots:
          void keyPressEvent(QKeyEvent*);
          void keyReleaseEvent(QKeyEvent*);
      //...
      }
      

      主窗口.cpp

      #include <QDebug>
      #include "mainwindow.h"
      
      void MainWindow::keyPressEvent(QKeyEvent* ke)
      {
              qDebug() << Q_FUNC_INFO;
              qDebug() << "mw" << ke->key() << "down";
              QMainWindow::keyPressEvent(ke); // base class implementation
      }
      
      void MainWindow::keyReleaseEvent(QKeyEvent* ke)
      {
              qDebug() << Q_FUNC_INFO;
              qDebug() << "mw" << ke->key() << "up";
              if(ke->key() == Qt::Key_Back)// necessary for Q_OS_ANDROID
              {
                      // Some code that handles the key press I want to use
                      // Note: default handling of the key is skipped
                      ke->accept();
                      return;
              }
              else
              {
                      // allow for the default handling of the key
                      QMainWindow::keyReleaseEvent(ke); // aka the base class implementation
              }
      }
      

      希望对您有所帮助。

      【讨论】:

      • 从 MainWindow::keypressevent 调用 MainWindow::keypressevent 不会导致无限循环吗?程序如何区分我定义的方法和基类的方法?我要学习一些新东西!
      • 对不起,你是对的。那是一个错字。它应该是您子类化的基类。所以如果你继承QMainWindow,它应该说QMainWindow。如果你继承 QWidget,它应该说 QWidget 等等。
      • 最后一行代码不应该是 QMainWindow::keyReleaseEvent(ke); ?
      • 是的。这看起来像是我的错字。
      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 2013-01-08
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多