首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt响应子QWidget中的keyPressEvent

Qt响应子QWidget中的keyPressEvent
EN

Stack Overflow用户
提问于 2011-10-25 01:27:38
回答 1查看 10K关注 0票数 7

我有一个这样的QWidget派生类:

代码语言:javascript
运行
复制
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类:

代码语言:javascript
运行
复制
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或我的main_window类中的QGridLayout中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-25 01:35:51

QWidget::keyPressEvent这样说:

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

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

另外,后面的一行写着:

如果您重新实现此处理程序,则在不按键操作的情况下调用基类实现是非常重要的。

你在你的小部件中忽略了这一点,但是在你的主窗口中这样做。请确保在这两个地方都这样做。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7879385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档