Qt响应子QWidget中的keyPressEvent

Ton*_*ion 7 c++ events qt keypress

我有一个QWidget派生类,如下所示:

class tetris_canvas : public QWidget
{
    Q_OBJECT

public:
    tetris_canvas(QWidget * parent = 0);
    ~tetris_canvas();

protected:
    void paintEvent(QPaintEvent *event);
    void keyPressEvent(QKeyEvent *event);
};

//Never hits this keyPressEvent!!!
void tetris_canvas::keyPressEvent(QKeyEvent * event)
{
    if (event->key() == Qt::Key_Down)
    {
        rect->moveBottom(20);
        update();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有我的main_window类:

class main_window : public QWidget
{
    Q_OBJECT

public:
    main_window(QWidget* parent = 0, Qt::WFlags flags = 0);
    ~main_window();

protected:
    void keyPressEvent(QKeyEvent * event);
};

//This keyPressEvent is hit!
void main_window::keyPressEvent(QKeyEvent* event)
{
    if (event->key() == Qt::Key_Escape)
    {
        QApplication::exit(0);
    }
    QWidget::keyPressEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何让keyPressEvent我的tetris_canvas小部件响应按键?

我正在绘制画布,我需要响应按键,以便用户可以与画布上的内容进行交互.

小部件被添加到QGridLayoutctor或我的main_window类中.

Mat*_*Mat 10

QWidget::keyPressEvent说:

小部件必须setFocusPolicy()最初调用以接受焦点并具有焦点以便接收按键事件.

所以你应该这样做.(因为你没有展示你的构造函数,我猜你错过了那个部分.)

之后的行说:

如果重新实现此处理程序,则在不对键执行操作时调用基类实现非常重要.

您在窗口小部件中丢失了它,但在主窗口中执行此操作.确保你在两个地方都这样做.