zoukankan      html  css  js  c++  java
  • 打地鼠游戏(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 }

    内在的趣味,表面的繁琐
  • 相关阅读:
    《译》准备做一些 AR/增强现实的 翻译
    (转)两张Firefox OS 系统截图
    Hello World!
    centos7安装docker
    linux用户及组相关命令
    Go 系列教程 ——第 30 篇:错误处理
    Go 系列教程 ——第 29 篇:Defer
    linux远程管理相关命令
    linux文件目录相关命令
    centos7安装mysql-8.0.15
  • 原文地址:https://www.cnblogs.com/data1213/p/10851329.html
Copyright © 2011-2022 走看看