【问题标题】:Qt respond to keyPressEvent in child QWidgetQt响应子QWidget中的keyPressEvent
【发布时间】:2011-12-14 07:54:31
【问题描述】:

我有一个这样的 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();
    }
}

然后我有我的 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);
}

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

我在该画布内绘图,我需要响应按键,以便用户可以与该画布上的事物进行交互。

小部件被添加到 ctor 中的 QGridLayout 或我的 main_window 类中。

【问题讨论】:

    标签: c++ qt events keypress


    【解决方案1】:

    QWidget::keyPressEvent 是这样说的:

    小部件必须首先调用setFocusPolicy() 来接受焦点并获得焦点才能接收按键事件。

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

    后面的那一行写着:

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

    您在小部件中缺少该功能,但在主窗口中执行此操作。确保在这两个地方都这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多