打地鼠游戏(4)

事件重写

QT界面的每一个操作都是一个事件,这些事件会发送相应的信号,之前只是去绑定这些信号,然后触发我们自定义的槽函数。

但是,还有一些操作本身就有默认的处理,比如点击"MainWindow"窗口的关闭按钮,那么窗口被关闭,程序停止,如果需要在单击关闭按钮之后,弹出一个dialog来提示用户是否真的关闭,该怎么实现?——事件重写

1、找到事件函数的名字,重写哪个函数?

关闭按钮,是窗口的基本功能,——QWidget

1 //改写关闭窗口的按钮事件函数
2 void MainWindow::closeEvent(QCloseEvent *event){
3     int ret = QMessageBox::question(this,"确定","真的关闭吗?","确定","取消");
4     if(ret == 1){ //取消
5         event->ignore();
6     }
7 }

定义场景的点击事件:

场景是由16个图元构成的,当点击老鼠时,实际上只是点击了某个图元,如果是场景的点击事件,那么在任意位置点击,都会当做是触发了点击事件,不管是否打到老鼠。

所以,需要重写的是图元的点击事件——确定重写谁的点击事件。

事件,一般情况下都是protected属性的,并且不是所有的控件,都是直接去写QWidget中的事件函数,首先应该看控件直接父类,父类追溯到QWidget父类时,才去重写其事件函数。

 1 #ifndef MYITEM_H
 2 #define MYITEM_H
 3 #include <QGraphicsPixmapItem>
 4 
 5 class myitem : public QGraphicsPixmapItem
 6 {
 7 public:
 8     myitem();
 9     void setPic(QString src);
10 };
11 
12 #endif // MYITEM_H

当前图元的父类——QGraphicsPixmapItem,查看帮助文档,看是否存在点击事件

1 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
3 virtual void mousePressEvent(QGraphicsSceneMouseEvent *event)  //鼠标按下
5 virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) //鼠标抬起

这里选用鼠标按下函数来重写:为了判断是否真正打到老鼠,需要在图元中增加一个老鼠标识,当置换为老鼠图片时,需要更新这个标识为有老鼠的状态,然后当重写单击时,先去判断一下当前图元是否为有老鼠的属性。

 1 #ifndef MYITEM_H
 2 #define MYITEM_H
 3 #include <QGraphicsPixmapItem>
 4 
 5 class myitem : public QGraphicsPixmapItem
 6 {
 7 public:
 8     myitem();
 9     void setPic(QString src);
10 
11     virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
12 
13     void setmouse(bool mouse);  //设置老鼠标识
14     bool ismouse();             //读取老鼠标识
15 private:
16     bool mouse;                 //标识图元是否老鼠图元
17 
18 };
19 
20 #endif // MYITEM_H
 1 #include "myitem.h"
 2 #include <QPixmap>
 3 #include <QDebug>
 4 
 5 myitem::myitem()
 6 {   /*
 7     void setPixmap(const QPixmap &pixmap);
 8     绑定图片到图元
 9     */
10     this->setPixmap(QPixmap(":/mouse/pic/bg1.png"));
11 }
12 
13 //重新设置图片,从而实现更换图片的效果
14 void myitem::setPic(QString src){
15     this->setPixmap(src);
16 }
17 
18 void myitem::setmouse(bool mouse){
19     this->mouse = mouse;
20 }
21 
22 bool myitem::ismouse(){
23     return this->mouse;
24 }
25 
26 void myitem::mousePressEvent(QGraphicsSceneMouseEvent *event){
27     //判断当前是否是老鼠
28     if(this->ismouse()){
29         qDebug()<<"打到老鼠";
30     }else{
31         qDebug()<<"未打到老鼠";
32     }
33 }
 1 #include "myscene.h"
 2 
 3 #include <stdlib.h>
 4 #include <time.h>
 5 
 6 MyScene::MyScene(QObject *parent) : QGraphicsScene(parent)
 7 {
 8 
 9     //添加图元到场景
10     for(int i = 0;i<16;i++){
11         this->item[i] = new myitem();
12         //设置坐标
13         /*一维数组转换为二维数组,下面宽、高的倍数组合
14         0 0,0 1,0 2,0 3
15         1 0,1 1,1 2,1 3
16         2 0,2 1,2 2,2 3
17         3 0,3 1,3 2,3 3
18         */
19         double x = i/4 * this->item[i]->boundingRect().width();
20         double y = i%4 * this->item[i]->boundingRect().height();
21         this->item[i]->setPos(x,y);
22         this->addItem(this->item[i]);
23     }
24 
25     //绑定一个定时器,等定时周期到触发一个随机数[0-15],然后让场景中的一个图元的图片更换
26     this->p_timer = new QTimer();
27     connect(this->p_timer, SIGNAL(timeout()), this, SLOT(update_my_item())); //绑定定时器和槽函数
28     this->p_timer->start(1000); //1s
29 
30 }
31 
32 MyScene::~MyScene(){
33     for(int i = 0;i<16;i++){
34         delete this->item[i];
35     }
36     delete this->p_timer;
37 }
38 
39 
40 void MyScene::update_my_item(){
41     //每次出现老鼠之前,先恢复到所有图元为无老鼠的样式图片
42     for(int i = 0;i<16;i++){
43         this->item[i]->setPic(":/mouse/pic/bg1.png");
44 
45         //同时需要恢复图元老鼠标识为默认
46         this->item[i]->setmouse(false);
47     }
48 
49     srand(time(NULL)); //设置随机数种子
50 
51     //一次性允许显式最多三个老鼠
52     int count = rand()%3 +1;
53     for(int k=1;k<=3;k++){
54         int i = rand()%16;
55         this->item[i]->setPic(":/mouse/pic/mouse.png");
56 
57         //同时需要设置图元老鼠标识
58         this->item[i]->setmouse(true);
59     }
60 }

猜你喜欢

转载自www.cnblogs.com/data1213/p/10851329.html