一个小程序,让你知道Qt一次能支持按下多少个键(一)

来源:互联网 发布:c#和c语言的区别 编辑:程序博客网 时间:2024/05/02 00:55

一个小程序,让你知道Qt一次能支持按下多少个键(一)


写这一篇日志的目的在于将Qt按键事件系统进行二次封装,制作出符合游戏要求的按键处理,我们知道有时候游戏需要响应多个按键的,这个小程序就是我朝着这方面目标的一个小小的尝试。


源代码的下载地址:这里

首先是Widget.h头文件,它是窗口类的声明。

#ifndef WIDGET_H#define WIDGET_H#include <QString>#include <QList>#include <QWidget>/*---------------------------------------------------------------------------*/class Widget: public QWidget{    Q_OBJECTpublic:    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应用程序一次性最多支持多少个键按下。