zoukankan      html  css  js  c++  java
  • 打地鼠游戏(6)

    对于记分控件,因为是在点击到老鼠图元的情况下才会触发记分,但是记分控件是mainwindow的属性,图元怎么通知到mainwindow?

    mainwindow中能够访问的是view容器,容器包含场景,场景包含图元,怎么实现图元通知到mainwindow——单例模式。

    设计思路:

    首先创建一个随处可以访问的一个对象(单例)然后这个对象可以发送信号(继承自QObject),在单击到老鼠时,触发发送信号,然后再在mainwindow中去捕获这个信号,更新记分控件。

    1、首先创建单例:

     1 #ifndef HANDLE_H
     2 #define HANDLE_H
     3 
     4 #include <QObject>
     5 
     6 class handle : public QObject
     7 {
     8     Q_OBJECT
     9 public:
    10     static handle* getinstence();
    11     void addscore();
    12     ~handle(){
    13         if(pt_handle != NULL){
    14             delete pt_handle;
    15         }
    16     }
    17 private:
    18     explicit handle(QObject *parent = nullptr);
    19     static handle* pt_handle;
    20 
    21 signals:
    22     void send_sigal();  //自定义信号,只需要声明,不需要定义
    23 
    24 };
    25 
    26 #endif // HANDLE_H
     1 #include "handle.h"
     2 
     3 handle::handle(QObject *parent) : QObject(parent)
     4 {
     5 
     6 }
     7 
     8 handle* handle::pt_handle = NULL;
     9 
    10 handle* handle::getinstence(){
    11     if(pt_handle == NULL){
    12         pt_handle = new handle();
    13     }
    14 }
    15 
    16 void handle::addscore(){
    17     emit send_sigal();  //发送自定义信号
    18 }

    当点击到老鼠,调用发送信号的函数——addscore()

     1 //------------------------------------myitem.cpp
     2 void myitem::mousePressEvent(QGraphicsSceneMouseEvent *event){
     3     //判断当前是否是老鼠
     4     if(this->ismouse()){
     5         qDebug()<<"打到老鼠";
     6         handle* pt = handle::getinstence();
     7         pt->addscore();
     8     }else{
     9         qDebug()<<"未打到老鼠";
    10     }
    11 }

    在mainwindow中去绑定,该信号,并定义槽函数

     1 #ifndef MAINWINDOW_H
     2 #define MAINWINDOW_H
     3 
     4 #include <QMainWindow>
     5 
     6 #include "myscene.h"
     7 
     8 #include "handle.h"
     9 
    10 namespace Ui {
    11 class MainWindow;
    12 }
    13 
    14 class MainWindow : public QMainWindow
    15 {
    16     Q_OBJECT
    17 
    18 public:
    19     explicit MainWindow(QWidget *parent = nullptr);
    20     ~MainWindow();
    21 
    22     virtual void closeEvent(QCloseEvent *event);
    23 
    24 private:
    25     Ui::MainWindow *ui;
    26     MyScene * sc;
    27 private slots:
    28     void updatescore(); //更新显示记分器
    29 private:
    30     int score;      //记分
    31     handle* pt;
    32 
    33 };
    34 
    35 #endif // MAINWINDOW_H
     1 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
     2 {
     3     ui->setupUi(this);
     4     //将场景在容器中进行显式
     5     this->sc = new MyScene();
     6     ui->graphicsView->setScene(this->sc);
     7 
     8     //控件绑定
     9     connect(this->ui->btn_begin,SIGNAL(clicked()),this->sc,SLOT(start_game()));
    10     connect(this->ui->btn_hold,SIGNAL(clicked()),this->sc,SLOT(hold_game()));
    11     connect(this->ui->btn_end,SIGNAL(clicked()),this->sc,SLOT(end_game()));
    12 
    13     this->score = 0;
    14     this->pt = handle::getinstence();
    15     connect(this->pt,SIGNAL(send_sigal()),this,SLOT(updatescore()));
    16 }
    17 
    18 void MainWindow::updatescore(){
    19     this->score += 10;
    20     this->ui->lcdnum->display(this->score);
    21 
    22 }
    内在的趣味,表面的繁琐
  • 相关阅读:
    十年经验手把手教你选购翡翠
    眼睛视力
    玻璃
    前端小技巧
    儿童牙齿矫正
    MySQL的JDBC驱动源码解析
    书海杂谈
    电子设备
    股市国家队
    影视
  • 原文地址:https://www.cnblogs.com/data1213/p/10852233.html
Copyright © 2011-2022 走看看