QKeyEvent在我的应用程序不工作
QKeyEvent in my app does not work
我想编写一个响应我的键事件的复古蛇,下面是我的代码:
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)
您还必须使用Qt::StrongFocus
参数调用widget的setFocusPolicy
函数。因此,widget通过选择和单击来接受焦点。
相关文章:
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- OpenGL应用程序在不同的计算机上的工作方式不同
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- Visual Studio 中的套接字 c++ 应用程序无法通过两台计算机之间的以太网连接工作
- 如何将子窗口(MFC 应用程序)的工作区保存到图像
- 为什么我需要运行一个应用程序作为Papi库工作的根源
- 从 WebAPI 项目运行静态类时出现 StackOverflow 异常 - 从控制台应用程序运行时工作正常
- 当我跳到应用程序时,中断无法工作(STM32)
- 如何使用工作线程正确退出Qt应用程序
- 运行在DLL中的工作线程在应用程序关闭时被终止,然后才能正常关闭它们
- 套接字应用程序无法正常工作
- C++使用Qt库的应用程序在屏幕保护程序启动时停止工作
- 在我的Win32应用程序中使TAB键起工作
- 什么可能导致应用程序在工作几个小时后锁定获取 SIGABRT 失败
- 如何使用特定的工作目录运行/调试Netbeans平台应用程序
- 绘制移动图标,它一直是最顶端的鼠标光标和工作的全屏应用程序
- SQL SP在SSMS中正常工作,但在VC++应用程序中失败
- boost::asio 中的未经请求的消息使应用程序崩溃,没有 SSL 它可以正常工作,为什么
- MacOSX C++带有命令行应用程序的工作目录