【发布时间】:2015-01-21 17:36:30
【问题描述】:
QWidget::keyPressEvent 方法的 Qt 文档说:
如果您重新实现此处理程序,那么在您不对键执行操作的情况下调用基类实现非常重要。
但是,我不确定使用什么代码来确保按键被传递到行中的下一个对象来处理它。我有一个函数void MainWindow::keyPressEvent(QKeyEvent *k)。如果我“不按键操作”,我应该在方法中添加什么?
【问题讨论】:
QWidget::keyPressEvent 方法的 Qt 文档说:
如果您重新实现此处理程序,那么在您不对键执行操作的情况下调用基类实现非常重要。
但是,我不确定使用什么代码来确保按键被传递到行中的下一个对象来处理它。我有一个函数void MainWindow::keyPressEvent(QKeyEvent *k)。如果我“不按键操作”,我应该在方法中添加什么?
【问题讨论】:
如果您重新实现此处理程序,那么如果您不对键进行操作,那么调用基类实现非常重要。
在 C++ 中,如果要调用基类方法,请使用 :: 范围运算符来执行此操作。如果要推迟到基类的实现,只需写:
return QWidget::keyPressEvent(k);
这就是“调用基类实现”的意思。
【讨论】:
更新:修正错字,修复无限循环。
主窗口.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
}
}
希望对您有所帮助。
【讨论】: