c++ - 我的应用程序中的 QKeyEvent 不起作用

标签 c++ linux qt connect qkeyevent

我想编写一个响应我的按键事件的复古 snaker,这是我的代码:

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()函数,我想知道这个函数没有连接任何东西,它可以工作吗?实际上它没有,但我不知道如何激活它。我还需要做其他事情吗?

最佳答案

http://qt-project.org/doc/qt-4.8/qwidget.html#keyPressEvent .您需要覆盖 keyPressEvent,而不是创建您自己的 keyPress 函数。

所以,改变

void keypress(QKeyEvent* keyevent);

void keyPressEvent(QKeyEvent* keyevent)

关于c++ - 我的应用程序中的 QKeyEvent 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15630857/

相关文章:

c++ - 是否可以强制通过引用或指针(C++)传递类?

c++ - 打印链表元素

c++ - 在 C++ 中将图像读入像素矩阵

linux - 从 shell 脚本调用脚本 - 找不到获取命令

c++ - 有没有办法从插槽中删除特定信号

c++ - 编译 Qt 应用程序时出现体系结构 x86_64 错误的重复符号

c++ - 使用 Atmel Studio C++ Build 时无法在 xmega 中使用 ISR

linux - 开源保管箱类型的软件?

linux - 如何最好地将混合编码的邮箱文件转换为 UTF-8?

c++ - Opencv 在 Qt5.13 中不工作。应用程序总是在 Windows 中崩溃