`
jgsj
  • 浏览: 962152 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics