一个小程序,让你知道Qt一次能支持按下多少个键(一)
写这一篇日志的目的在于将Qt按键事件系统进行二次封装,制作出符合游戏要求的按键处理,我们知道有时候游戏需要响应多个按键的,这个小程序就是我朝着这方面目标的一个小小的尝试。
源代码的下载地址:这里
首先是Widget.h头文件,它是窗口类的声明。
#ifndef WIDGET_H
#define WIDGET_H
#include <QString>
#include <QList>
#include <QWidget>
/*---------------------------------------------------------------------------*/
class Widget: public QWidget
{
Q_OBJECT
public:
Widget( void );
~Widget( void );
protected:
void paintEvent( QPaintEvent* pEvent );
void keyPressEvent( QKeyEvent* pEvent );
void keyReleaseEvent( QKeyEvent* pEvent );
private:
void SetShowText( void );
QString m_Text;
QString m_ShowText;
QList<int> m_KeyPressedList;
};
/*---------------------------------------------------------------------------*/
#endif // WIDGET_H
这里处理了按键按下事件和按键弹出事件,以及绘制事件。之所以要重新实现绘制事件,是因为需要对文字进行更新,以便我们对按键处理情况有一个实时的了解。
注意我们使用了一个QList来对已经按下的按键进行保存。也就是说,这个数据是我们获知Qt一次能支持按下多少个键的关键。
下面是Widget.cpp的内容。
#include <QPoint>
#include <QtAlgorithms>
#include <QKeyEvent>
#include <QPainter>
#include "Widget.h"
Widget::Widget( void ): QWidget( 0 )
{
// 设置窗口的一些属性
setFixedSize( 640, 360 );
setWindowTitle( tr( "KeyTest" ) );
// 设置文字
m_Text = tr( "Try to press key.\n" );
m_KeyPressedList.clear( );
}
/*---------------------------------------------------------------------------*/
Widget::~Widget( void )
{
}
/*---------------------------------------------------------------------------*/
void Widget::paintEvent( QPaintEvent* pEvent )
{
Q_UNUSED( pEvent );
QPainter painter( this );
painter.drawText( QPoint( 32, 32 ), m_Text );
painter.drawText( QPoint( 32, 64 ), m_ShowText );
}
/*---------------------------------------------------------------------------*/
void Widget::keyPressEvent( QKeyEvent* pEvent )
{
m_KeyPressedList.append( pEvent->key( ) );
m_Text = tr( "The key %1 pressed." ).arg( pEvent->key( ) );
SetShowText( );
update( );
}
/*---------------------------------------------------------------------------*/
void Widget::keyReleaseEvent( QKeyEvent* pEvent )
{
m_KeyPressedList.erase( qFind( m_KeyPressedList.begin( ),
m_KeyPressedList.end( ), pEvent->key( ) ) );
m_Text = tr( "The key %1 released." ).arg( pEvent->key( ) );
SetShowText( );
update( );
}
/*---------------------------------------------------------------------------*/
void Widget::SetShowText( void )
{
m_ShowText = tr( "Pressed Keys: " );
foreach ( int key, m_KeyPressedList )
{
m_ShowText += key;
m_ShowText += '\n';
}
}
在按键按下时,我们在QList中添加这个按键,在按键弹出时,我们搜索出该键,并由QList<T>::erase方法予以删除。
以下是程序的演示效果:
我发现同时按下1和2,那么3以后的按键都不能按了,同时按下2和3,那么1和5不能再按下去,但是6键可以按下去。这是怎么一回事呢?我也希望有高人能够指点指点。不过我们可以通过这个程序,知道Qt应用程序一次性最多支持多少个键按下。
分享到:
相关推荐
多个按键同时按下的实现方法,目前实现了左、右、上、下、Enter按键以及左+上+Enter的实现,读者可以自行拓展该程序。
QT判断两个键同时被按下
一个简单的qt程序QPushButton测试,点击按钮按钮消失
Qt 计算器小程序
一个简单的qt测试按钮程序
这个程序使用windows的钩子(hook)实现的,Qt官方没有相关的实现 关于编译,我用的是Qt5.9.7 MinGW32位,我还用了Qt 5.6.3MinGW32位,也变过去了, 更换编译环境时候可能会报错,这些问题请百度 我遇到过声明的...
上次演示程序表明,Qt可以支持多个按键同时按下,这可以激起我们探索按键在游戏中的作用。知道吗?操作感是大多数游戏成功的因素之一,不谈那些网游,那些街机游戏更是将操作感视为其生命线。Qt要成为一款成功的...
示例是单击qt界面上的一个按钮,然后程序自动关闭当前窗口,然后打开一个界面,类似于qq点击了qq登录按钮之后,界面有所变化
轻松实现qt下点击按钮所实现的外部程序的调用!
该文档详细描述了QT平台下,让应用程序只运行一个实例的三种方法,并附有相应的代码。
在windows下,使用qt编写程序,并以打包。
QT-小键盘输入,可以嵌入到写的QT程序代码中直接用,简单但完整实用。修改一下,方便大家参考
一个用qt实现的图片自动循环播放的小程序。 对刚刚学qt的新生有用!
QT做一个按钮Qpushbutton 倒计时功能的小小程序 https://jackzhang.blog.csdn.net/article/details/125747200 的源码。欢迎交流啊
qt 小程序qt 小程序qt 小程序
用QT编的一个时钟的小程序源码,界面简洁大方,跟电脑时间同步。
Qt 实现利用方向键控制光标在不同控件上移动(本资源控件为LineEdit),上下方向键可直接移动至上一个或下一个控件,左右方向键配合Ctrl键使用,本资源借鉴相关网络资源编写。
QT自动关机小程序,支持倒计时关机,设定时间模式关机
一个简单的qt版helloworld程序
qt的键盘事件不能捕获多个按键按下.即便是在使用modifiers()时,也只能获得类似于shfit+x,ctrl+c,alt+y等等之类的快捷键,对于shift+x+c诸如此类更多的组合就无能为力的.本案例中提供了一种捕获shift+a+b...组合键的...