一个小程序,让你知道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应用程序一次性最多支持多少个键按下。