Qt浅谈之四十九俄罗斯方块(代码来自网络)
一、简介
从网上下载了一个Qt实现的俄罗斯方块单机版的源码,觉得非常有意思,故以博客形式记录下来,以便慢慢来研究。在centos6.6下编译运行(注意程序运行需要读取pro目录的配置文件,若把编译目录选择在pro外的话运行会报错):
二、详解
1、部分代码
(1)main.cpp
- #include <QApplication>
- #include <QTextCodec>
- #include <QCursor>
- #include "TetrixWidget.h"
- int main( int argc, char **argv )
- {
- QApplication a( argc, argv );
- QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
- QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
- QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
- //则更换图标
- QCursor myCursor( QPixmap( GLOBAL_CURSOR_IMAGE ) ) ;
- QApplication::setOverrideCursor( myCursor ) ;
- //这个是因为要使用Phonon这里要设置一个名字,可能是考虑到版权相关的问题吧,不然会有一个警告
- //并无其他实际意义
- a.setApplicationName("MyTetrix Game");
- TetrixWidget widget ;
- widget.show();
- return a.exec();
- }
(2)TetrixWidget.h
- #ifndef TETRIXWIDGET_H
- #define TETRIXWIDGET_H
- #include <QDesktopWidget>
- #include <QApplication>
- #include <QWidget>
- #include <QGraphicsView>
- #include <QSettings>
- #include <QStringList>
- #include <QImage>
- #include <QPoint>
- #include <QKeyEvent>
- #include "GameGraphicsScene.h"
- #include "GameBackGroundItem.h"
- #include "GameLogoImageItem.h"
- #include "GameButtonItem.h"
- #include "GameArrowItem.h"
- #include "GameMovBackGrouItem.h"
- #include "GameIntroductionItem.h"
- #include "GameOptionItem.h"
- #include "GameHighWinItem.h"
- #include "GameGameSound.h"
- #include "globaldefines.h"
- /**************************************************************************
- * 常量 *
- **************************************************************************/
- /**************************************************************************
- * 宏定义 *
- **************************************************************************/
- /**************************************************************************
- * 数据类型 *
- **************************************************************************/
- /**************************************************************************
- * 类声明 *
- **************************************************************************/
- class TetrixWidget : public QWidget
- {
- Q_OBJECT
- signals:
- //发送信号给ArrowItem,改变其坐标到坐标索引的index
- void moveArrowat( int index ) ;
- //这个是遮蔽箭头item上面的箭头的信号
- //这个信号放在这个类里是因为,按钮弹出的Item会通过按Esc来返回,这样就不能再发信号还原
- //其状态
- void coverOnArowItemSignal( bool state ) ;
- /**********************这个是当游戏被停用时的发送的信号********************/
- //这个是当游戏被停用时的发送的信号
- //就是当鼠标点击电脑桌面其他位置时,就是我们平常所说的整个游戏软件失去焦点时。发送这个信号
- void gameDeactivateSignal() ;
- public:
- TetrixWidget(QWidget *parent=0) ;
- ~TetrixWidget() ;
- private:
- QGraphicsView *gameView ;
- GameGraphicsScene *gameScene ;
- void setTetrixWigAttribute() ; //设置TetrixWidget类的属性
- void initGameSceneAndView() ; //初始化游戏的场景与视图
- QSettings *configIni ; //这个是用于读取配置文件指针
- //这是定义的一个表,用来存储图片名字与图片的指针
- //这个作为一个大的容器,所以图片都放在里面。便于之后用
- NameAndImageHash nameImageHash ;
- //根据组名及每组对应的图片数目的A值来读取配置文件,并且加载图片文件。
- void initAndLoadImage( QString groupname, QString A_valueString ) ;
- void loadAllImageFile() ; //加载所有的图片
- //这个坐标ponit用于取图片上某个坐标点的色素作为透明色,默认为QPoint( 0,0 )
- QImage *getTransImage( QImage *image , QPoint ponit = QPoint( 0,0 ) ) ;
- /*
- 这个是处理所有的粉红色背景的图片,使只编程透明色背景
- */
- void dealPinkBackGroundImage( QString groupname, QString A_valueString ) ;
- /*
- 这个是因为当第三层出现时,用户按下Esc键,要回到第二层游戏首页,
- 所以在这里用这个hash表来记录
- */
- NumAndPointerHash numPointer ;
- /*
- 这个是用来记录当前在第二层上面的Item,通过这个序号在NumAndPointerHash
- 中查找Item对应的指针,默认为-1
- */
- int nowIndex ;
- /*
- 这里是因为,这个设置的图片太小,要把下面的开始与退出按钮给隐藏掉,
- 不然用户移动鼠标会误点到
- */
- void setSomeItemVisible( bool visible ) ;
- //从配置文件中读出所要的音量的值
- inline int getVolumeValueFromFile( QString groupname ,QString A_valueString ) ;
- //从配置文件中读取是否要设置全屏
- inline bool getFullScreenValueFromFile( QString groupname ,QString A_valueString ) ;
- /****************************最底层的Item******************************/
- GameLogoImageItem *logoImageItem ;
- void addGameLogoImageItem( ) ; //添加GameLogoImageItem到场景去
- GameBackGroundItem *backGroundItem ;
- //这是定义的一个表,用来存储图片名字与图片的坐标
- //部分图片的坐标不需要写在配置文件,因为其默认坐标一直都是(0,0)
- NameAndPointHash namePointHash ;
- //根据组名及每组对应的图片数目的A值来读取配置文件,并且记录到namePointHash中去。
- void initNameAndPointHash( QString groupname ,QString A_valueString ) ;
- /****************************第二层的Item******************************/
- GameButtonItem *dianwoButton ; //点我的广告按钮
- GameButtonItem *moregameButton ; //更多的游戏按钮
- GameButtonItem *startgameButton ; //开始游戏按钮
- GameButtonItem *instrgameButton ; //游戏介绍按钮
- GameButtonItem *gameoptionButton ; //游戏选项按钮
- GameButtonItem *gamehihgscButton ; //游戏排行榜按钮
- GameButtonItem *exitgameButton ; //退出游戏按钮
- GameArrowItem *arrowItem ; //箭头Item
- /*
- 添加所有的第二层的Item,通过一个接口把所有的第二层的Item全部放进来,方便管理
- */
- void addAllSecondLayerItem() ;
- //分开进行添加这样不至于让一个函数变的很长
- void addDianWoButton() ; //添加点我按钮
- void addMoreGameButton() ; //添加更多的游戏按钮
- void addStartGameButton() ; //添加开始游戏按钮
- void addInstrGameButton() ; //添加游戏介绍按钮
- void addGameOptionButton() ; //添加游戏选项按钮
- void addGameHihgscButton() ; //添加游戏排行榜按钮
- void addExitGameButton() ; //添加退出游戏按钮
- void addArrowItem() ; //添加箭头Item
- /****************************第三层的Item******************************/
- GameMovBackGrouItem *movBacGrouItem ; //动态背景图片
- GameIntroductionItem *introduItem ; //游戏介绍Item
- GameOptionItem *optionItem ; //游戏选项Item
- GameHighWinItem *highWinItem ; //游戏排行榜Item
- /**************************游戏的背景音乐与音效的处理*************************/
- GameGameSound *gameSound ; //游戏的背景音乐与音效
- void initGameGameSound() ; //初始化游戏的背景音乐与音效
- private slots:
- void addGameBackGroundItem( ) ; //添加GameBackGroundItem到场景去
- void mouseOnStartgameButton( ) ; //光标在开始游戏按钮
- void mouseOnInstrgameButton( ) ; //光标在游戏介绍按钮
- void mouseOnGameOptionButton( ) ; //光标在游戏选项按钮
- void mouseOnGameHihgscButton( ) ; //光标在游戏排行榜按钮
- void mouseOnExitgameButton( ) ; //光标在退出游戏按钮
- void clickOnStartgameButton( ) ; //单击开始游戏按钮
- void clickOnInstrgameButton( ) ; //单击游戏介绍按钮
- void clickOnGameOptionButton( ) ; //单击游戏选项按钮
- void clickOnGameHihgscButton( ) ; //单击游戏排行榜按钮
- void clickOnExitgameButton( ) ; //单击退出游戏按钮
- /*
- 这个是根据当前箭头序号来确定进入到哪个Item的槽函数
- */
- void clickOnButton( int index ) ;
- /*
- 用户按Esc键返回到第二层,返回游戏首页的信号的槽函数
- */
- void backToSecondLaySlot( int index ) ;
- //这个是前景Item的退回到游戏首页的按钮的槽函数
- void backToGameHomeSlot() ;
- protected:
- //事件过滤器
- bool eventFilter ( QObject * watched, QEvent * event ) ;
- void resizeEvent ( QResizeEvent * event );
- };
- #endif // TETRIXWIDGET_H
(3)TetrixWidget.cpp
- /************************************************************************
- * 版权所有 (C)2011, 上海欣诺有限公司。
- *
- * 文件名称: TetrixWidget.cpp
- * 文件标识:
- * 内容摘要: TetrixWidget类的实现
- * 其它说明:
- * 当前版本: 1.0
- * 作 者:
- * 完成日期:
- *
- * 修改记录1:
- * 修改日期:
- * 版 本 号:
- * 修 改 人:
- * 修改内容:
- * 修改记录2:…
- ************************************************************************/
- #include "TetrixWidget.h"
- #include <QDebug>
- /**************************************************************************
- * 常量 *
- **************************************************************************/
- /**************************************************************************
- * 宏 *
- **************************************************************************/
- /**************************************************************************
- * 数据类型 *
- **************************************************************************/
- /**************************************************************************
- * 全局变量 *
- **************************************************************************/
- /**************************************************************************
- * 局部函数原型 *
- **************************************************************************/
- /**************************************************************************
- * 类TetrixWidget实现--公有部分 *
- **************************************************************************/
- /**************************************************************************
- * 函数名称: TetrixWidget
- * 功能描述: 构造函数
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- TetrixWidget::TetrixWidget(QWidget *parent)
- :QWidget(parent),nowIndex( -1 )
- {
- //初始化,设置其读取ini为后缀的配置文件
- configIni = new QSettings( CONFIGUREPATH,QSettings::IniFormat ) ;
- //首先加载是两个logo文件
- initAndLoadImage( GROUPNAME_LOGO,LOGO_COUNT ) ;
- /*
- 设置控件显示的参数,因为其大小是根据logo图片的大小还算的,所以要放在读取配置文件之后
- */
- setTetrixWigAttribute() ;
- //初始化视图的大小也是根据两个logo图片的大小来确定的,所以要放在读取配置文件之后
- initGameSceneAndView() ;
- addGameLogoImageItem() ; //添加GameLogoImageItem到场景去
- /*
- 只所以把GameLogoImageItem添加到场景去再加载所有的图片,
- 是因为logo图片有个渐显的效果,可以利用这个间隙把所有的图片
- 全部加载进来,该处理的出来掉。这样可以有效的利用时间,让用户感觉不到
- 加载图片过程
- */
- loadAllImageFile() ; //加载所有的图片
- /*
- 根据组名及每组对应的图片数目的A值来读取配置文件,并且记录到namePointHash中去。
- */
- initNameAndPointHash( GROUPNAME_COORDINATE ,COORDINATE_COUNT) ;
- }
- /***********************************************************************
- * 函数名称: ~TetrixWidget()
- * 功能描述: 析构函数
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- *************************************************************************/
- TetrixWidget::~TetrixWidget()
- {
- //这个显示delete,qt都可以通过qt来进行delete的
- delete gameSound ;
- }
- /**************************************************************************
- * 函数名称: setTetrixWigAttribute
- * 功能描述: 设置TetrixWidget类的属性
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::setTetrixWigAttribute()
- {
- /*
- 这里是设置屏蔽窗口最大化的按钮的属性,在linux下没有效果,在windows有效果不知道为啥
- */
- this->setWindowFlags( Qt::Window
- | Qt::WindowMinimizeButtonHint
- | Qt::WindowCloseButtonHint );
- //设置居中屏幕显示
- QDesktopWidget* desktop = QApplication::desktop(); // =qApp->desktop();也可以
- /*
- 这个是根据logo的大小来确定的,由于控件比图片多一个宽口管理其,所以height加40进行调整
- ,以达到初始显示在屏幕中间的效果
- */
- if( nameImageHash.contains( LOGO_1 ) )
- {
- int width = nameImageHash.value(LOGO_1)->size().width() ;
- int height = nameImageHash.value(LOGO_1)->size().height() + 40 ;
- move((desktop->width() - width)/2, (desktop->height() - height)/2);
- }
- //安装事件过滤器
- this->installEventFilter( this );
- setWindowTitle("俄罗斯方块单机版 V1.0");
- }
- /**************************************************************************
- * 函数名称: initAndLoadImage
- * 功能描述: 根据组名及每组对应的图片数目的A值来读取配置文件,并且加载图片文件。
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::initAndLoadImage(QString groupname, QString A_valueString)
- {
- if( !groupname.isEmpty() )
- {
- configIni->beginGroup( groupname );
- configIni->setIniCodec( "UTF-8" );
- int count = configIni->value( A_valueString).toInt() ;
- QStringList keyslist = configIni->allKeys() ;
- //configIni->allKeys()因为这个里面有包含啦求数目的那条A值
- if( keyslist.count() == (count + 1) )
- {
- foreach( QString value,keyslist )
- {
- //如果为数目的A值,则不做处理
- if( QString::compare( value , A_valueString ) )
- {
- QString imagePath = configIni->value( value ).toString() ;
- QImage *iamge = new QImage( imagePath ) ;
- //如果不能加载图片文件,则退出
- if( iamge->isNull() )
- {
- QString errorString = QString("File :%1 is not exit !" ).arg(imagePath) ;
- DEBUGP( errorString ) ;
- configIni->endGroup();
- return ;
- }
- //把图片名字与图片加入到hash表中
- nameImageHash.insert( value,iamge ) ;
- }
- }
- }
- else
- {
- DEBUGP( "Configure File Num Error !" ) ;
- configIni->endGroup();
- return ;
- }
- configIni->endGroup();
- }
- }
- /*************************************************************************
- * 函数名称: initNameAndPointHash
- * 功能描述: 根据组名及每组对应的图片数目的A值来读取配置文件,并且记录到namePointHash中去
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::initNameAndPointHash(QString groupname, QString A_valueString)
- {
- if( !groupname.isEmpty() )
- {
- configIni->beginGroup( groupname );
- configIni->setIniCodec( "UTF-8" );
- int count = configIni->value( A_valueString ).toInt() ;
- QStringList keyslist = configIni->allKeys() ;
- //configIni->allKeys()因为这个里面有包含啦求数目的那条A值
- if( keyslist.count() == (count + 1) )
- {
- foreach( QString key,keyslist )
- { //如果为数目的A值,则不做处理
- if( QString::compare( key , A_valueString ) )
- {
- QPoint pos = configIni->value(key).toPoint() ;
- //DEBUGP( pos ) ;
- namePointHash.insert( key,pos ) ;
- }
- }
- }
- configIni->endGroup();
- }
- }
- /*************************************************************************
- * 函数名称: getTransImage
- * 功能描述: 这个坐标ponit用于取图片上某个坐标点的色素作为透明色,默认为QPoint( 0,0 )
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- QImage *TetrixWidget::getTransImage(QImage *image, QPoint ponit)
- {
- //判断所取的点是否在图片内部
- if( image->valid( ponit ) )
- {
- QRgb rgb = image->pixel( ponit );
- QVector<QRgb> rgbVector = image->colorTable () ;
- for (int i = 0; i < rgbVector.size(); ++i)
- {
- if( rgbVector.at(i) == rgb )
- {
- /*
- 注意这里如果要变成黑色背景的话就是QRgb rgb2 = QColor(0, 0, 0, 0).rgb() ;
- 留意 rgb()与rgba()的区别
- */
- QRgb rgb2 = QColor(0, 0, 0, 0).rgba() ;
- image->setColor( i,rgb2 );
- return image ;
- }
- }
- }
- return image ;
- }
- /*************************************************************************
- * 函数名称: initGameSceneAndView
- * 功能描述: 初始化游戏的场景与视图
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::initGameSceneAndView()
- {
- gameScene = new GameGraphicsScene() ;
- gameScene->setBackgroundBrush(Qt::black);
- //这里要是不限制场景的大小的话,之后小鱼游动时,其场景会增大,之后显示就会移动
- //因为小鱼要被完全隐藏掉之后,才掉头重新开始游这样就可能增大场景,故再这里给写死
- gameScene->setSceneRect(0, 0, SCENEWIDTH, SCENEHEIGHT);
- gameView = new QGraphicsView(this) ;
- gameView->setScene(gameScene);
- //设置文字去锯齿显示
- gameView->setRenderHints(QPainter::Antialiasing
- | QPainter::TextAntialiasing);
- //设置大小,跟logo图片的大小一样大,不能写死,这样灵活些
- if( nameImageHash.contains( LOGO_1 ) )
- {
- /*
- 在这里把长宽进行微调,不然会出现在场景中滚动鼠标是,场景上下移动的问题
- */
- int width = nameImageHash.value(LOGO_1)->size().width()+ 2 ;
- int height = nameImageHash.value(LOGO_1)->size().height() + 2 ;
- gameView->resize( width,height );
- }
- //关闭水平滚动条与垂直滚动条
- gameView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- gameView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- }
- /*************************************************************************
- * 函数名称: loadAllImageFile
- * 功能描述: 加载所有的图片
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::loadAllImageFile()
- {
- //加载ModeWin组的文件
- initAndLoadImage( GROUPNAME_MODEWIN,MODEWIN_COUNT ) ;
- //加载DianWoWin组的文件
- initAndLoadImage( GROUPNAME_DIANWOWIN,DIANWOWIN_COUNT ) ;
- //加载OptionWin组的文件
- initAndLoadImage( GROUPNAME_OPTIONWID,OPTIONWID_COUNT ) ;
- //加载Box组的文件
- initAndLoadImage( GROUPNAME_BOX,BOX_COUNT ) ;
- //加载BackWin组的文件
- initAndLoadImage( GROUPNAME_BACKWIN,BACKWIN_COUNT ) ;
- //加载BombWin组的文件
- initAndLoadImage( GROUPNAME_BOMBWIN,BOMBWIN_COUNT ) ;
- //加载MainWin组的文件
- initAndLoadImage( GROUPNAME_MAINWIN,MAINWIN_COUNT ) ;
- //修改MustModify组A值所对应的图片,去掉其背景粉红色,变为透明背景
- dealPinkBackGroundImage( GROUPNAME_MUSTMODIFY,MUSTMODIFY_COUNT ) ;
- }
- /*************************************************************************
- * 函数名称: dealPinkBackGroundImage
- * 功能描述: 添加dealPinkBackGroundImage到场景去
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::dealPinkBackGroundImage(QString groupname, QString A_valueString )
- {
- if( !groupname.isEmpty() )
- {
- configIni->beginGroup( groupname );
- configIni->setIniCodec( "UTF-8" );
- int count = configIni->value( A_valueString).toInt() ;
- QStringList keyslist = configIni->allKeys() ;
- //configIni->allKeys()因为这个里面有包含啦求数目的那条A值
- if( keyslist.count() == (count + 1) )
- {
- foreach( QString key,keyslist )
- {
- //如果为数目的A值,则不做处理
- if( QString::compare( key , A_valueString ) )
- {
- //DEBUGP( key ) ;
- //对图片进行处理,去掉粉红的背景
- QImage *image = getTransImage( nameImageHash.value( key ) );
- //重新发修改后的值加入到hash表中
- nameImageHash.insert( key,image ) ;
- }
- }
- }
- //注意读完这个组一定要关闭,否则会影响到下面的读取
- configIni->endGroup();
- }
- }
- /*************************************************************************
- * 函数名称: addGameLogoImageItem
- * 功能描述: 添加GameLogoImageItem到场景去
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addGameLogoImageItem()
- {
- logoImageItem = new GameLogoImageItem() ;
- //
- connect(logoImageItem,SIGNAL(addGameBackGroundItem())
- ,this,SLOT(addGameBackGroundItem())) ;
- logoImageItem->setGameScene( gameScene,nameImageHash);
- }
- /*************************************************************************
- * 函数名称: addAllSecondLayerItem
- * 功能描述: 添加所有的第二层的Item,通过一个接口把所有的第二层的Item全部放进来,方便管理
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addAllSecondLayerItem()
- {
- //DEBUGP( "addAllSecondLayerItem" ) ;
- //点我广告的按钮
- addDianWoButton() ;
- //更多的游戏按钮
- addMoreGameButton() ;
- //开始游戏按钮
- addStartGameButton() ;
- //游戏介绍按钮
- addInstrGameButton() ;
- //游戏选项按钮
- addGameOptionButton() ;
- //游戏排行榜按钮
- addGameHihgscButton() ;
- //退出游戏按钮
- addExitGameButton() ;
- //箭头Item
- addArrowItem() ;
- }
- /*************************************************************************
- * 函数名称: addArrowItem
- * 功能描述: 添加箭头Item
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addArrowItem()
- {
- //箭头Item
- arrowItem = new GameArrowItem( MODEWIN_ARROW ) ;
- //在这里连接改变坐标的信号与槽
- connect(this,SIGNAL(moveArrowat(int)),arrowItem,SLOT(setPointListIndex(int))) ;
- //这个是根据当前箭头序号来确定进入到哪个Item的槽函数
- connect(arrowItem,SIGNAL(enterIntoButton(int)),this,SLOT(clickOnButton(int)));
- //通过这个信号返回到第二层----游戏首页
- connect(arrowItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int)));
- arrowItem->setGameScene(gameScene,nameImageHash,namePointHash);
- /*
- 这里为啦保持跟上面的一直,所以把设置Z轴的放在这里,其实不必要放在这里,
- 因为箭头类是一个单独的类,只有一个对象在用
- */
- arrowItem->setZValue(1.0);
- }
- /*************************************************************************
- * 函数名称: addExitGameButton
- * 功能描述: 添加退出游戏按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addExitGameButton()
- {
- //退出游戏按钮
- exitgameButton = new GameButtonItem( MODEWIN_EXIT ) ;
- connect(exitgameButton,SIGNAL(mouseOnMe()),
- this,SLOT(mouseOnExitgameButton())) ;
- connect(exitgameButton,SIGNAL(buttonClick()),this,SLOT(close())) ;
- exitgameButton->setGameScene(gameScene,nameImageHash,namePointHash);
- exitgameButton->setZValue(1.0); //因为不是全部都在同一层,所有得分开来设置其Z轴的值
- }
- /*************************************************************************
- * 函数名称: addGameHihgscButton
- * 功能描述: 添加游戏排行榜按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addGameHihgscButton()
- {
- //游戏排行榜按钮
- gamehihgscButton = new GameButtonItem( MODEWIN_HIGHSCORE ) ;
- connect(gamehihgscButton,SIGNAL(mouseOnMe()),
- this,SLOT(mouseOnGameHihgscButton())) ;
- connect(gamehihgscButton,SIGNAL(buttonClick()),this,SLOT(clickOnGameHihgscButton()));
- gamehihgscButton->setGameScene(gameScene,nameImageHash,namePointHash);
- gamehihgscButton->setZValue(1.0); //因为不是全部都在同一层,所有得分开来设置其Z轴的值
- }
- /*************************************************************************
- * 函数名称: addGameOptionButton
- * 功能描述: 添加游戏选项按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addGameOptionButton()
- {
- //游戏选项按钮
- gameoptionButton = new GameButtonItem( MODEWIN_OPTION ) ;
- connect(gameoptionButton,SIGNAL(mouseOnMe()),
- this,SLOT(mouseOnGameOptionButton())) ;
- connect(gameoptionButton,SIGNAL(buttonClick()),
- this,SLOT(clickOnGameOptionButton())) ;
- gameoptionButton->setGameScene(gameScene,nameImageHash,namePointHash);
- gameoptionButton->setZValue(1.0); //因为不是全部都在同一层,所有得分开来设置其Z轴的值
- }
- /*************************************************************************
- * 函数名称: addInstrGameButton
- * 功能描述: 添加游戏介绍按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addInstrGameButton()
- {
- //游戏介绍按钮
- instrgameButton = new GameButtonItem( MODEWIN_INSTRUCTION ) ;
- connect(instrgameButton,SIGNAL(mouseOnMe()),
- this,SLOT(mouseOnInstrgameButton())) ;
- connect(instrgameButton,SIGNAL(buttonClick())
- ,this,SLOT(clickOnInstrgameButton())) ;
- instrgameButton->setGameScene(gameScene,nameImageHash,namePointHash);
- instrgameButton->setZValue(1.0); //因为不是全部都在同一层,所有得分开来设置其Z轴的值
- }
- /*************************************************************************
- * 函数名称: addDianWoButton
- * 功能描述: 添加点我按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addDianWoButton()
- {
- //点我广告的按钮
- dianwoButton = new GameButtonItem( DIANWOWIN_BUTTON ) ;
- dianwoButton->setGameScene(gameScene,nameImageHash,namePointHash);
- dianwoButton->setZValue(1.0); //因为不是全部都在同一层,所有得分开来设置其Z轴的值
- }
- /*************************************************************************
- * 函数名称: addMoreGameButton
- * 功能描述: 添加更多的游戏按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addMoreGameButton()
- {
- //更多的游戏按钮
- moregameButton = new GameButtonItem( MODEWIN_MOREGAME ) ;
- moregameButton->setGameScene(gameScene,nameImageHash,namePointHash);
- moregameButton->setZValue(1.0); //因为不是全部都在同一层,所有得分开来设置其Z轴的值
- }
- /*************************************************************************
- * 函数名称: addStartGameButton
- * 功能描述: 添加开始游戏按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addStartGameButton()
- {
- startgameButton = new GameButtonItem( MODEWIN_START ) ;
- connect(startgameButton,SIGNAL(mouseOnMe()),
- this,SLOT(mouseOnStartgameButton())) ;
- connect(startgameButton,SIGNAL(buttonClick()),
- this,SLOT(clickOnStartgameButton())) ;
- startgameButton->setGameScene(gameScene,nameImageHash,namePointHash);
- startgameButton->setZValue(1.0); //因为不是全部都在同一层,所有得分开来设置其Z轴的值
- }
- /*************************************************************************
- * 函数名称: setSomeItemVisible
- * 功能描述: 这里是因为,这个设置的图片太小,要把下面的开始与退出按钮给隐藏掉,
- * 不然用户移动鼠标会误点到
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:控制这四个按钮的显示与隐藏
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::setSomeItemVisible(bool visible)
- {
- startgameButton->setVisible( visible );
- exitgameButton->setVisible( visible );
- dianwoButton->setVisible( visible );
- moregameButton->setVisible( visible );
- }
- /*************************************************************************
- * 函数名称: getVolumeValueFromFile
- * 功能描述: 从配置文件中读出所要的音量的值
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:控制这四个按钮的显示与隐藏
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- inline int TetrixWidget::getVolumeValueFromFile(QString groupname, QString A_valueString)
- {
- configIni->beginGroup( groupname );
- configIni->setIniCodec( "UTF-8" );
- int volume = configIni->value( A_valueString ).toInt() ;
- configIni->endGroup();
- return volume ;
- }
- /*************************************************************************
- * 函数名称: getFullScreenValueFromFile
- * 功能描述: 从配置文件中读取是否要设置全屏
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:控制这四个按钮的显示与隐藏
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- inline bool TetrixWidget::getFullScreenValueFromFile(QString groupname, QString A_valueString)
- {
- configIni->beginGroup( groupname );
- configIni->setIniCodec( "UTF-8" );
- bool fullscreen = configIni->value( A_valueString ).toBool() ;
- configIni->endGroup();
- return fullscreen ;
- }
- /*************************************************************************
- * 函数名称: initGameGameSound
- * 功能描述: 初始化游戏的背景音乐与音效
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::initGameGameSound()
- {
- int musicVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_MUSIC ) ;
- int audioVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_AUDIO ) ;
- gameSound = new GameGameSound( musicVolume,audioVolume ) ;
- gameSound->setGameSceneAndConfigF(gameScene,configIni);
- }
- /*************************************************************************
- * 函数名称: addGameBackGroundItem
- * 功能描述: 添加addGameBackGroundItem到场景去
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::addGameBackGroundItem()
- {
- //在添加背景图片前先移除两个logo图片
- gameScene->removeItem( logoImageItem );
- backGroundItem = new GameBackGroundItem() ;
- backGroundItem->setGameScene( gameScene,nameImageHash );
- //添加所有的第二层的Item
- addAllSecondLayerItem() ;
- //初始化游戏的背景音乐与音效
- initGameGameSound();
- }
- /*************************************************************************
- * 函数名称: mouseOnStartgameButton
- * 功能描述: 光标在开始游戏按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明: 5个Button发送过来的信号分别对应不同的槽函数,在槽函数中又分别发送同一信号
- * 不同参数,这样觉得有点麻烦,一下子用啦5个槽函数,目前没有想到更好的办法。
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::mouseOnStartgameButton()
- {
- //DEBUGP( 0 ) ;
- emit moveArrowat( 0) ;
- }
- /*************************************************************************
- * 函数名称: mouseOnInstrgameButton
- * 功能描述: 光标在游戏介绍按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::mouseOnInstrgameButton()
- {
- //DEBUGP( 1 ) ;
- emit moveArrowat( 1 ) ;
- }
- /*************************************************************************
- * 函数名称: mouseOnGameOptionButton
- * 功能描述: 光标在游戏选项按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::mouseOnGameOptionButton()
- {
- //DEBUGP( 2 ) ;
- emit moveArrowat( 2 ) ;
- }
- /*************************************************************************
- * 函数名称: mouseOnGameHihgscButton
- * 功能描述: 光标在游戏排行榜按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::mouseOnGameHihgscButton()
- {
- //DEBUGP( 3 ) ;
- emit moveArrowat( 3 ) ;
- }
- /*************************************************************************
- * 函数名称: mouseOnExitgameButton
- * 功能描述: 光标在退出游戏按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::mouseOnExitgameButton()
- {
- //DEBUGP( 4 ) ;
- emit moveArrowat( 4 ) ;
- }
- /*************************************************************************
- * 函数名称: clickOnStartgameButton
- * 功能描述: 单击开始游戏按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::clickOnStartgameButton()
- {
- movBacGrouItem =new GameMovBackGrouItem( MAINWIN_BACKGROUND ) ;
- //这个作为序号0记录到hash表中
- nowIndex = 0 ;
- numPointer.insert( nowIndex,(void *)movBacGrouItem ) ;
- connect( this,SIGNAL(coverOnArowItemSignal(bool)),
- gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
- //转发游戏窗口停用信号到场景中的游戏暂停信号
- connect(this,SIGNAL(gameDeactivateSignal()),gameScene,SIGNAL(gameDeactivateSignal())) ;
- //连接从场景中转发出来的回到游戏首页的信号与槽函数
- connect(gameScene,SIGNAL(backToGameHomeSignal()),
- this,SLOT(backToGameHomeSlot())) ;
- movBacGrouItem->setGameScene( gameScene,nameImageHash,namePointHash );
- movBacGrouItem->setZValue( 3.0 ) ; //这个是作为第三层显示的
- //发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( true );
- }
- /*************************************************************************
- * 函数名称: clickOnInstrgameButton
- * 功能描述: 单击游戏介绍按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::clickOnInstrgameButton()
- {
- introduItem = new GameIntroductionItem( MODEWIN_HELP ) ;
- //这个作为序号1记录到hash表中
- nowIndex = 1 ;
- numPointer.insert( nowIndex,(void *)introduItem ) ;
- //返回游戏首页的信号的槽函数
- connect(introduItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int))) ;
- connect( this,SIGNAL(coverOnArowItemSignal(bool)),
- gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
- introduItem->setGameScene( gameScene,nameImageHash );
- introduItem->setZValue( 3.0 ) ; //这个是作为第三层显示的
- //发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( true );
- }
- /*************************************************************************
- * 函数名称: clickOnGameOptionButton
- * 功能描述: 单击游戏选项按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::clickOnGameOptionButton()
- {
- int musicVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_MUSIC ) ;
- int audioVolume = getVolumeValueFromFile( GROUPNAME_SETTINGS,SETTINGS_AUDIO ) ;
- bool fullScreen = getFullScreenValueFromFile( GROUPNAME_SETTINGS,SETTINGS_FULLSCREEN) ;
- //DEBUGP( audioVolume ) ;
- optionItem = new GameOptionItem( OPTIONWIN_SETTING,musicVolume,audioVolume,fullScreen ) ;
- connect(optionItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int))) ;
- connect( this,SIGNAL(coverOnArowItemSignal(bool)),
- gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
- //这个作为序号1记录到hash表中
- nowIndex = 2 ;
- numPointer.insert( nowIndex,(void *)optionItem ) ;
- optionItem->setGameScene( gameScene,nameImageHash,namePointHash );
- optionItem->setConfigureFile( configIni );
- optionItem->setZValue( 3.0 ) ; //这个是作为第三层显示的
- /*
- 这里是因为,这个设置的图片太小,要把下面的开始与退出按钮给隐藏掉,
- 不然用户移动鼠标会误点到
- */
- setSomeItemVisible( false ) ;
- //发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( true );
- }
- /*************************************************************************
- * 函数名称: clickOnGameHihgscButton
- * 功能描述: 单击游戏排行榜按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::clickOnGameHihgscButton()
- {
- highWinItem = new GameHighWinItem( MODEWIN_HIGHWIN );
- connect(highWinItem,SIGNAL(backToSecondLay(int)),this,SLOT(backToSecondLaySlot(int))) ;
- connect( this,SIGNAL(coverOnArowItemSignal(bool)),
- gameScene,SIGNAL(changeCoveredStateSignal(bool))) ;
- //这个作为序号1记录到hash表中
- nowIndex = 3 ;
- numPointer.insert( nowIndex,(void *)highWinItem ) ;
- highWinItem->setGameScene( gameScene,nameImageHash,namePointHash );
- highWinItem->setZValue( 3.0 ) ; //这个是作为第三层显示的
- //发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( true );
- }
- /*************************************************************************
- * 函数名称: clickOnExitgameButton
- * 功能描述: 单击退出游戏按钮
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::clickOnExitgameButton()
- {
- //退出程序
- this->close() ;
- }
- /*************************************************************************
- * 函数名称: clickOnButton
- * 功能描述: 这个是根据当前箭头序号来确定进入到哪个Item的槽函数
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::clickOnButton(int index)
- {
- switch( index )
- {
- case 0:
- clickOnStartgameButton() ;
- break ;
- case 1:
- clickOnInstrgameButton() ;
- break ;
- case 2:
- clickOnGameOptionButton() ;
- break ;
- case 3:
- clickOnGameHihgscButton() ;
- break ;
- case 4:
- clickOnExitgameButton() ;
- break ;
- default:
- break ;
- }
- }
- /*************************************************************************
- * 函数名称: backToSecondLaySlot
- * 功能描述: 用户按Esc键返回到第二层,返回游戏首页的信号的槽函数
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明: 通过这个当前箭头所对应的序号的值
- * 比如说
- * 0---->开始游戏
- * 1---->游戏介绍
- * 。。。。。。
- * 在NumAndPointerHash表中查找相应的Item的指针的值
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::backToSecondLaySlot( int index )
- {
- void * item ;
- /*
- 如果当用户本来就在第二层游戏首页时,这个时候却按下Esc键,这个时候这个item为空。
- 首先得判断hash表中有没这个key值
- */
- if( numPointer.contains( index ) )
- {
- item = numPointer.value( index ) ;
- if( item )
- {
- //因为每个类型的指针的类型是不同的,所以这里得这样分开来写
- switch( index )
- {
- case 0:
- //在这里发送信号,先去删除动态珊瑚背景层之上的东西,也就是第四层与第五层的东西
- //因为第四层与第五层都是作为动态珊瑚背景(第三层)的成员变量,所以在这里得在删除第三层前
- //删掉第四层与第五层的东西
- ((GameMovBackGrouItem *)item)->removeFourthAndFifthItemFun();
- gameScene->removeItem( (GameMovBackGrouItem *)item );
- delete ((GameMovBackGrouItem *)item);
- //再次发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( false );
- break ;
- case 1:
- gameScene->removeItem( (GameIntroductionItem *)item );
- delete (GameIntroductionItem *)item ;
- //再次发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( false );
- break ;
- case 2:
- //使得四个按钮恢复显示
- setSomeItemVisible( true ) ;
- gameScene->removeItem( (GameOptionItem *)item );
- delete (GameOptionItem *)item ;
- //再次发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( false );
- break ;
- case 3:
- gameScene->removeItem( (GameHighWinItem *)item );
- delete (GameHighWinItem *)item ;
- //再次发送信号来还原之前改变的箭头Item的遮蔽状态
- emit coverOnArowItemSignal( false );
- break ;
- case 4:
- break ;
- default:
- DEBUGP( "index error !" ) ;
- break ;
- }
- //清空现在的记录,以便下次再进行切换
- nowIndex = -1 ;
- numPointer.remove( index ) ;
- }
- }
- }
- /*************************************************************************
- * 函数名称: backToGameHomeSlot
- * 功能描述: 这个是前景Item的退回到游戏首页的按钮的槽函数
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- void TetrixWidget::backToGameHomeSlot()
- {
- //因为这个时候是进入游戏之后才可以看到游戏的前景
- backToSecondLaySlot( 0 ) ;
- }
- /*************************************************************************
- * 函数名称: eventFilter
- * 功能描述: 事件过滤器
- * 访问的表:
- * 修改的表:
- * 输入参数:
- * 输出参数:
- * 返 回 值:
- * 其它说明:这个是重载事件过滤器函数,通过这个函数判断,当鼠标移动到其他的软件的窗口时,
- * 这个时候整个游戏软件被停用。在这个时候发送暂停游戏的消息
- * 修改日期 版本号 修改人 修改内容
- * -----------------------------------------------
- *
- **************************************************************************/
- bool TetrixWidget::eventFilter(QObject *watched, QEvent *event)
- {
- if( watched == this )
- {
- //窗口停用,及一般人认为的失去焦点
- if(QEvent::WindowDeactivate == event->type())
- {
- //
- //DEBUGP( "eventFilter" ) ;
- emit gameDeactivateSignal() ;
- return true ;
- }
- else
- {
- return false ;
- }
- }
- return false ;
- }
- void TetrixWidget::resizeEvent(QResizeEvent *event)
- {
- gameScene->setSceneRect(0, 0, gameView->width(), gameView->height());
- }
三、总结
(1)上述代码是一个非常不错的项目例子,自己也在拜读代码(也有很多不懂的地方),并在实际工作中加以应用。
(2)上述代码已上传到CSDN:http://download.csdn.net/detail/taiyang1987912/9480721。
(3)若有问题或建议,请留言,在此感谢!
http://blog.csdn.net/taiyang1987912/article/details/51055817
Qt浅谈之四十九俄罗斯方块(代码来自网络)的更多相关文章
- Qt浅谈之四十五QSplitter实现自由伸缩滑动窗口
一.简介 最近看到一篇Qt实现伸缩滑动的窗口的文章,但其代码不完整.便在此重新书写了完整的代码,并开源出来.窗口的中央有滑动条可以动态改变子窗口的大小,隐藏的按钮可以快速伸缩子窗口.其效果图如下: 二 ...
- Qt浅谈之三十九圆形进度条(已经有50篇了)
http://blog.csdn.net/taiyang1987912/article/category/2314763
- Qt浅谈之十八:GraphicsView框架事件处理(有源码下载)
一.简介 GraphicsView支持事件传播体系结构,可以使图元在场景scene中得到提高了已被的精确交互能力.图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景给相应的图形项. ...
- Qt浅谈内存泄露(总结)
Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...
- Qt浅谈之总结(整理)
Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
- Qt浅谈之二十App自动重启及关闭子窗口
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
- Qt浅谈之二十App自动重启及关闭子窗口(六种方法)
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
随机推荐
- Linux系统编程(32)—— socket编程之TCP服务器与客户端
TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...
- (2015多校第6场)HDU5361--In Touch (Dijkstra应用)
In Touch Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- JS-Array数组内置对象
直接上代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- Linux 常用命令记录
1.查看磁盘空间使用情况 df -[a i m] 或更多 df -lh 2.查看目录文件占用大小 du -sh * du --max-depth=1 -lh 3.内存使用qingkuang free ...
- selenium page object model
Page Object Model (POM) & Page Factory in Selenium: Ultimate Guide 来源:http://www.guru99.com/page ...
- C#_Test
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Plus ...
- Objective-C基础学习笔记——对象初始化
obj中创建新对象有两种方式:[classname new]和[[classname alloc] init].两种方法等价,Cocoa惯例是使用alloc和init. 1.分配对象: allocat ...
- 【创业积累】如何快速开发出一个高质量的APP
[起] 今早,一个技术群里有人想快速做出一个app,然后询问技术方案,大概是这样, 拿到了200w投资,期望花20w两个月先做出一个app,包括ios,android, 先,呵呵,一下, 大概预估了一 ...
- structured sparsity model
Data representation往往基于如下最小化问题: (1) 其中X是观测到的数据的特征矩阵,D是字典,Z是字典上的描述.约束项和使得字典dictionary和描述code具 ...
- C#文件的拆分与合并操作示例
C#文件的拆分与合并操作示例代码. 全局变量定义 ;//文件大小 //拆分.合并的文件数 int count; FileInfo splitFile; string splitFliePath; Fi ...