我的应用程序中的 QKeyEvent 不起作用
Posted
技术标签:
【中文标题】我的应用程序中的 QKeyEvent 不起作用【英文标题】:QKeyEvent in my app does not work 【发布时间】:2013-03-26 06:38:37 【问题描述】:我想编写一个响应我的键事件的复古蛇,这是我的代码:
paint.h
#ifndef PAINT_H
#define PAINT_H
#include<QWidget>
#include<QPaintEvent>
#include<QKeyEvent>
#include<QTimer>
class paint:public QWidget
Q_OBJECT
public:
paint(QWidget*parent=0);
~paint();
protected:
void paintEvent(QPaintEvent* );
void keypress(QKeyEvent* keyevent);
public slots:
void autorun();
private:
int snake[100][2];
int length;
QTimer *timer;
int flag;
;
#endif
paint.cpp
#include"paint.h"
#include<QtGui>
paint::paint(QWidget*parent):QWidget(parent)
flag=1;
snake[0][0]=45;
snake[0][1]=45;
length=4;
timer=new QTimer;
timer->start(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(autorun()));
paint::~paint()
void paint::paintEvent(QPaintEvent* )
QPainter p(this);
p.setWindow(0,0,810,810);
QRectF border(45-20,45-20,16*45+40,16*45+40);
QRectF inter(45,45,16*45,16*45);
p.setPen(Qt::NoPen);
p.setBrush(QBrush(Qt::darkMagenta,Qt::SolidPattern));
p.drawRect(border);
p.setBrush(QBrush(Qt::gray,Qt::SolidPattern));
p.drawRect(inter);//
p.setPen(Qt::NoPen);
for(int i=45;i<=17*45;i+=45)
p.drawLine(45,i,17*45,i);
p.drawLine(i,45,i,17*45);
p.setPen(QPen(Qt::darkGray,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
// for(int i=0;i<length;++i)
QRectF snakebody(snake[0][0],snake[0][1],45,45);
p.setBrush(QBrush(Qt::red));
p.drawRect(snakebody);
void paint::keypress(QKeyEvent* keyevent)
qDebug()<<"key"<<endl;
switch(keyevent->key())
case Qt::Key_Up:
snake[0][1]=45;
break;
case Qt::Key_Down:
snake[0][1]=720;
break;
case Qt::Key_Left:
snake[0][0]=45;
break;
case Qt::Key_Right:
snake[0][1]=720;
break;
case Qt::Key_Q:
qDebug()<<"Q"<<endl;
break;
void paint::autorun()
snake[0][1]+=45;
if(snake[0][1]>720)
snake[0][1]=45;
snake[0][0]+=45;
if(snake[0][0]>720)
snake[0][0]=45;
update();
关注keypress()
函数,不知道这个函数什么都连接不上,能用吗?实际上它没有,但我不知道如何激活它。我还需要做什么吗?
【问题讨论】:
【参考方案1】:http://qt-project.org/doc/qt-4.8/qwidget.html#keyPressEvent。您需要重写 keyPressEvent,而不是创建自己的 keyPress 函数。
所以,改变
void keypress(QKeyEvent* keyevent);
到
void keyPressEvent(QKeyEvent* keyevent)
【讨论】:
我试过了,但还是不行……而且我还添加了 setFocusPolicy(Qt::StrongFocus);在构造函数中。还是错了。我很困惑...... 是的!!它有效!!我犯了一个愚蠢的错误……我把 keyPressEvent 写成了 KeyPressEvent……非常感谢!! 这就是为什么 override 是语言中如此重要的补充! :) 提示:在您的代码库上运行 clang-modernize 以自动将覆盖添加到您的方法中。 仍然对我不起作用,我正在 mainwindow.cpp 中使用 mainwindow::keyPressEvent【参考方案2】:您还必须使用Qt::StrongFocus
参数调用小部件的setFocusPolicy
函数。因此,小部件通过 Tab 键和单击来接受焦点。
【讨论】:
我认为这不是问题所在。该小部件将继续专注于启动。问题是Qt框架为QWidgets上的按键调用的回调接口没有实现,即QWidget::keyPressEvent。 我添加了 setFocusPolicy(Qt::StrongFocus);在构造函数中。还是错了。 它有效!我犯了一个愚蠢的错误……我把 keyPressEvent 写成 KeyPressEvent……非常感谢!!:-) 仍然对我不起作用,我正在 mainwindow.cpp 中使用 mainwindow::keyPressEvent以上是关于我的应用程序中的 QKeyEvent 不起作用的主要内容,如果未能解决你的问题,请参考以下文章