QT翻金币小游戏(含音频图片文件资源)

目录

QT翻金币小游戏

音频图片资源文件获取

效果展示

图片

视频

实现代码

main.cpp

 mymainwindow.h

mymainwindow.cpp

 startscene.h

startscene.cpp

selectscene.cpp

playscene.h

playscene.cpp

 mypushbutton.h

 mypushbutton.cpp

dataconfig.h

dataconfig.cpp


QT翻金币小游戏

音频图片资源文件获取

通过百度网盘分享的文件:音频与图片资源
链接:https://pan.baidu.com/s/1GvZl3YaNG-Fl11Hi0rk6WQ 
提取码:coin

效果展示

图片

 

视频

QT翻金币

实现代码

main.cpp

#include "mymainwindow.h"  // 引入自定义的 MyMainWindow 类头文件
#include "startscene.h"    // 引入自定义的 StartScene 类头文件#include <QApplication>    // 引入 Qt 应用程序类的头文件int main(int argc, char *argv[])
{QApplication a(argc, argv);  // 创建 QApplication 对象,初始化应用程序,处理命令行参数StartScene sc;               // 创建 StartScene 对象,作为应用程序的主场景或窗口sc.show();                   // 显示 StartScene 对象,即显示窗口return a.exec();             // 进入 Qt 事件循环,等待并处理事件
}

 mymainwindow.h

#ifndef MYMAINWINDOW_H  // 如果没有定义 MYMAINWINDOW_H
#define MYMAINWINDOW_H  // 定义 MYMAINWINDOW_H,防止头文件被多次包含#include <QMainWindow>  // 引入 QMainWindow 类
#include <QSoundEffect>  // 引入 QSoundEffect 类用于播放声音
#include <QUrl>  // 引入 QUrl 类用于处理 URL
#include <QCoreApplication>  // 引入 QCoreApplication 类用于应用程序的核心功能QT_BEGIN_NAMESPACE  // 开始 Qt 命名空间namespace Ui {
class MyMainWindow;  // 前向声明 Ui::MyMainWindow 类
}QT_END_NAMESPACE  // 结束 Qt 命名空间class MyMainWindow : public QMainWindow  // 定义 MyMainWindow 类,继承自 QMainWindow
{Q_OBJECT  // 使得类可以使用 Qt 的信号和槽机制public:MyMainWindow(QWidget *parent = nullptr);  // 构造函数,接受一个可选的父窗口参数~MyMainWindow();  // 析构函数void playSoundEffect(const QString& filePath);  // 声明播放声音效果的成员函数protected:void paintEvent(QPaintEvent *event);  // 声明绘制事件的重写函数private:Ui::MyMainWindow *ui;  // 指向自动生成的 UI 类的指针
};#endif // MYMAINWINDOW_H  // 结束头文件保护宏

mymainwindow.cpp

#include "mymainwindow.h"  // 引入自定义的 MyMainWindow 类头文件
#include "./ui_mymainwindow.h"  // 引入自动生成的 UI 文件头文件
#include <QPainter>  // 引入 Qt 的绘图类头文件MyMainWindow::MyMainWindow(QWidget *parent): QMainWindow(parent)  // 调用基类 QMainWindow 的构造函数, ui(new Ui::MyMainWindow)  // 初始化 UI 对象
{ui->setupUi(this);  // 设置 UI 组件ui->actionQuit->setIcon(QIcon(":/image/Quit.png"));  // 为“退出”动作设置图标this->setWindowIcon(QPixmap(":/image/Coin0001.png"));  // 设置主窗口图标this->setWindowTitle("翻金币小游戏");  // 设置主窗口标题this->setFixedSize(320,588);  // 设置窗口固定大小,宽320高588
}MyMainWindow::~MyMainWindow()
{delete ui;  // 删除 UI 对象以释放内存
}void MyMainWindow::playSoundEffect(const QString &filePath)
{QSoundEffect *sound = new QSoundEffect;  // 创建 QSoundEffect 对象sound->setSource(QUrl::fromLocalFile(filePath));  // 设置音频文件路径sound->setVolume(0.5f);  // 可选:设置音量为 0.5sound->play();  // 播放声音// 连接信号槽,当播放完成时自动删除对象QObject::connect(sound, &QSoundEffect::playingChanged, [sound]() {if (!sound->isPlaying()) {delete sound;  // 播放完成后删除声音对象}});
}void MyMainWindow::paintEvent(QPaintEvent *event)
{// 绘制背景图片QPainter painter(this);  // 创建 QPainter 对象用于绘图painter.translate(0,this->menuBar()->height());  // 将画家的原点移动到菜单栏下方QPixmap pix(":/image/MenuSceneBg.png");  // 加载背景图片painter.drawPixmap(0, 0, this->width(), this->height(), pix);  // 绘制背景图,填充整个窗口
}

 startscene.h

#ifndef STARTSCENE_H  // 检查是否未定义 STARTSCENE_H
#define STARTSCENE_H  // 定义 STARTSCENE_H,避免头文件重复包含#include <QMainWindow>  // 引入 QMainWindow 类
#include "mymainwindow.h"  // 引入 MyMainWindow 类的头文件
#include "selectscene.h"  // 引入 SelectScene 类的头文件class StartScene : public MyMainWindow  // StartScene 类继承自 MyMainWindow
{Q_OBJECT  // 使 StartScene 类成为 Qt 的对象模型的一部分,支持信号和槽机制
public:explicit StartScene(QWidget *parent = nullptr);  // 构造函数声明,接受一个可选的父窗口指针
private:SelectScene msc;  // 定义一个 SelectScene 类型的成员变量 msc
signals:
};#endif // STARTSCENE_H  // 结束条件编译,确保此头文件只被包含一次

startscene.cpp

#include "startscene.h"  // 引入 StartScene 头文件
#include "mypushbutton.h"  // 引入 MyPushButton 头文件
#include <QTimer>  // 引入 QTimer 类用于定时操作
#include <QSoundEffect>  // 引入 QSoundEffect 类用于播放声音效果StartScene::StartScene(QWidget *parent): MyMainWindow{parent}  // 调用基类 MyMainWindow 的构造函数
{// 开始按钮MyPushButton *btnStart = new MyPushButton(":/image/MenuSceneStartButton.png",":/image/MenuSceneStartButton.png",this);  // 创建 MyPushButton 对象,并设置图片和父窗口btnStart->resize(114,114);  // 设置按钮的尺寸btnStart->move(this->width()/2-btnStart->width()/2,  // 将按钮水平居中this->height()*3/4-btnStart->height()/2);  // 将按钮垂直位置设置为窗口高度的三分之四connect(btnStart, &MyPushButton::clicked, [=](){  // 连接按钮的 clicked 信号到槽函数this->playSoundEffect(":/music/TapButtonSound.wav");  // 播放按钮点击声音btnStart->setEnabled(false);  // 禁用按钮btnStart->moveDown();  // 执行下跳动画QTimer::singleShot(150, [=](){  // 在 150ms 后执行btnStart->moveUp();  // 执行上跳动画});QTimer::singleShot(300, [=](){  // 在 300ms 后执行btnStart->setEnabled(true);  // 启用按钮// 场景转换this->msc.move(this->pos());  // 移动 SelectScene 到当前窗口位置this->msc.show();  // 显示 SelectScenethis->hide();  // 隐藏当前窗口});});connect(&this->msc, &SelectScene::backBtnClicked, [=](){  // 连接 SelectScene 的 backBtnClicked 信号到槽函数this->playSoundEffect(":/music/BackButtonSound.wav");  // 播放返回按钮声音this->move(this->msc.pos());  // 移动当前窗口到 SelectScene 的位置this->show();  // 显示当前窗口this->msc.hide();  // 隐藏 SelectScene});
}

 selectscene.h

#ifndef SELECTSCENE_H  // 检查是否未定义 SELECTSCENE_H
#define SELECTSCENE_H  // 定义 SELECTSCENE_H,避免头文件重复包含#include <QMainWindow>  // 引入 QMainWindow 类
#include "mymainwindow.h"  // 引入 MyMainWindow 类的头文件class SelectScene : public MyMainWindow  // SelectScene 类继承自 MyMainWindow
{Q_OBJECT  // 使 SelectScene 类成为 Qt 的对象模型的一部分,支持信号和槽机制
public:explicit SelectScene(QWidget *parent = nullptr);  // 构造函数声明,接受一个可选的父窗口指针protected:void paintEvent(QPaintEvent *event);  // 声明重写的 paintEvent 方法,用于绘制界面signals:void backBtnClicked();  // 声明信号 backBtnClicked,当点击back按钮事件时信号发出
};#endif // SELECTSCENE_H  // 结束条件编译,确保此头文件只被包含一次

selectscene.cpp

#include "selectscene.h"  // 引入 SelectScene 类的头文件
#include <QPushButton>  // 引入 QPushButton 类
#include <QPainter>  // 引入 QPainter 类,用于绘图
#include "./ui_mymainwindow.h"  // 引入 MyMainWindow 的用户界面头文件
#include "mypushbutton.h"  // 引入 MyPushButton 类的头文件
#include "playscene.h"  // 引入 PlayScene 类的头文件// SelectScene 的构造函数
SelectScene::SelectScene(QWidget *parent): MyMainWindow{parent}  // 调用基类构造函数,初始化 parent
{this->setWindowTitle("选择关卡");  // 设置窗口标题为 "选择关卡"// 创建返回按钮MyPushButton *btnBack = new MyPushButton(":/image/BackButton.png",":/image/BackButtonSelected.png",this);btnBack->resize(72, 32);  // 设置按钮大小btnBack->move(this->width() - btnBack->width(),  // 设置按钮位置,使其靠右下角this->height() - btnBack->height());// 连接返回按钮的点击信号到 backBtnClicked 槽connect(btnBack, &QPushButton::clicked, this, &SelectScene::backBtnClicked);// 设置每个关卡按钮的尺寸和位置参数const int colwidth = 70;  // 列宽const int rowheight = 70;  // 行高const int xoffset = 25;  // X 偏移量const int yoffset = 130;  // Y 偏移量// 创建 20 个关卡按钮for(int i = 0; i < 20; i++){MyPushButton *btn = new MyPushButton(":/image/LevelIcon.png", ":/image/LevelIcon.png", this);btn->setText(QString::number(i + 1));  // 设置按钮上的文本为关卡号int col = i % 4;  // 计算列索引int row = i / 4;  // 计算行索引int x = col * colwidth + xoffset;  // 计算按钮的 X 坐标int y = row * rowheight + yoffset;  // 计算按钮的 Y 坐标btn->resize(57, 57);  // 设置按钮大小btn->move(x, y);  // 设置按钮位置// 连接按钮的点击信号到一个 lambda 表达式connect(btn, &MyPushButton::clicked, [=](){this->playSoundEffect(":/music/TapButtonSound.wav");  // 播放点击按钮的声音PlayScene *ps = new PlayScene(i + 1);  // 创建一个新的 PlayScene 实例ps->setAttribute(Qt::WA_DeleteOnClose);  // 设置属性,确保关闭时自动删除ps->move(this->pos());  // 将 PlayScene 窗口移动到当前窗口的位置ps->show();  // 显示 PlayScene 窗口this->hide();  // 隐藏当前窗口// 连接 PlayScene 的 backBtnClicked 信号到一个 lambda 表达式connect(ps, &PlayScene::backBtnClicked, [=](){this->playSoundEffect(":/music/BackButtonSound.wav");  // 播放返回按钮的声音this->move(ps->pos());  // 将当前窗口移动到 PlayScene 窗口的位置this->show();  // 显示当前窗口ps->close();  // 关闭 PlayScene 窗口});});}
}// 重写 paintEvent 方法,用于自定义绘图
void SelectScene::paintEvent(QPaintEvent *event)
{QPainter painter(this);  // 创建 QPainter 对象painter.translate(0, this->menuBar()->height());  // 移动画家到菜单栏下面QPixmap pix(":/image/OtherSceneBg.png");  // 加载背景图片painter.drawPixmap(0, 0, this->width(), this->height(), pix);  // 绘制背景图片pix.load(":/image/Title.png");  // 加载标题图片painter.drawPixmap(0, 0, pix);  // 绘制标题图片
}

playscene.h

#ifndef PLAYSCENE_H
#define PLAYSCENE_H#include <QMainWindow>  // 引入 QMainWindow 类
#include "mymainwindow.h"  // 引入 MyMainWindow 类
#include "coinbutton.h"  // 引入 CoinButton 类class PlayScene : public MyMainWindow  // PlayScene 继承自 MyMainWindow
{Q_OBJECT  // 使 PlayScene 成为 Qt 对象,支持信号和槽机制
public:PlayScene(int level, QWidget *parent = nullptr);  // 构造函数,接受关卡数和父窗口指针void flip(int row, int col);  // 翻转指定位置的硬币void judgeWin();  // 判断是否赢得游戏protected:void paintEvent(QPaintEvent *event);  // 重写 paintEvent 方法,用于自定义绘图signals:void backBtnClicked();  // 声明返回按钮点击的信号private:CoinButton *mCoins[4][4];  // 4x4 硬币按钮数组bool winFlag;  // 游戏胜利标志
};#endif // PLAYSCENE_H

playscene.cpp

#include "playscene.h" // 包含 PlayScene 类的头文件
#include "mypushbutton.h" // 包含 MyPushButton 类的头文件
#include "./ui_mymainwindow.h" // 包含 MyMainWindow 的 UI 头文件
#include <QPainter> // 包含 QPainter 用于绘制
#include <QLabel> // 包含 QLabel 用于文本显示
#include "coinbutton.h" // 包含 CoinButton 类
#include "dataconfig.h" // 包含 DataConfig 类
#include <QTimer> // 包含 QTimer 用于定时事件
#include <QPropertyAnimation> // 包含 QPropertyAnimation 用于动画PlayScene::PlayScene(int level, QWidget *parent) // PlayScene 构造函数: MyMainWindow{parent} // 初始化基类 MyMainWindow
{winFlag = false; // 初始化 winFlag 为 false 失败this->setWindowTitle(QString("关卡%1").arg(level)); // 设置窗口标题为当前关卡几MyPushButton *btnBack = new MyPushButton(":/image/BackButton.png", ":/image/BackButtonSelected.png",this); // 设置第一张图为未按下时的状态,第二张图为按下时的状态,父级为当前窗口btnBack->resize(72,32); // 设置返回按钮的大小btnBack->move(this->width()-btnBack->width(), this->height()-btnBack->height());// 将返回按钮移动到右下角connect(btnBack,&QPushButton::clicked,this,&PlayScene::backBtnClicked); // 连接返回按钮的点击信号到 backBtnClicked 槽QLabel *label = new QLabel(this); // 创建一个 QLabel 显示关卡信息label->resize(150,50); // 设置标签的大小label->setText(QString("Level:%1").arg(level)); // 设置标签文本为当前关卡几label->setFont(QFont("华文新魏",20)); // 设置标签字体和大小label->move(30,this->height()-label->height()); // 将标签移动到底部左侧const int colwidth = 50; // 每列的宽度const int rowheight = 50; // 每行的高度const int xoffset = 57; // 硬币按钮的 x 偏移量const int yoffset = 200; // 硬币按钮的 y 偏移量dataConfig data; // 创建 dataConfig 对象QVector <QVector <int >> dataArray = data.mData[level]; // 获取当前关卡的数据for(int row = 0; row < 4; row ++) // 遍历行{for(int col = 0; col < 4; col ++) // 遍历列{CoinButton *btn = new CoinButton(this); // 创建新的 CoinButtonmCoins[row][col] = btn; // 将按钮存储在 mCoins 数组中int x = col * colwidth + xoffset; // 计算 x 位置int y = row * rowheight + yoffset; // 计算 y 位置btn->setGeometry(x,y,50,50); // 设置按钮的大小和位置btn->setMstat(dataArray[row][col]); // 根据数据设置金币状态1为金币0为银币connect(btn,&CoinButton::clicked,[=](){ // 连接按钮点击信号到 flip 函数this->flip(row,col); // 调用 flip 函数处理金币翻转});}}
}void PlayScene::flip(int row, int col) // 处理硬币翻转的函数
{if(winFlag) // 如果已经赢了return; // 直接结束函数this->mCoins[row][col]->flip(); // 翻转点击位置的硬币this->playSoundEffect(":/music/ConFlipSound.wav"); // 播放翻转音效QTimer::singleShot(250,[=](){ // 250ms后翻转相邻的硬币if(row + 1 < 4) // 检查下方是否有硬币this->mCoins[row + 1][col]->flip(); // 翻转下方的硬币if(row - 1 >= 0) // 检查上方是否有硬币this->mCoins[row - 1][col]->flip(); // 翻转上方的硬币if(col - 1 >= 0) // 检查左侧是否有硬币this->mCoins[row][col - 1]->flip(); // 翻转左侧的硬币if(col + 1 < 4) // 检查右侧是否有硬币this->mCoins[row][col + 1]->flip(); // 翻转右侧的硬币this->judgeWin(); // 判断是否胜利});
}void PlayScene::judgeWin() // 判断是否完成关卡
{for(int row = 0; row < 4; row ++) // 遍历行{for(int col = 0; col < 4; col ++) // 遍历列{if(!this->mCoins[row][col]->getMstat()) // 如果有银币不是胜利状态return ; // 直接结束函数}}winFlag = true; // 设置 winFlag 为 true 胜利this->playSoundEffect(":/music/LevelWinSound.wav"); // 播放胜利音效QLabel *labelWin = new QLabel(this); // 创建 QLabel 显示胜利信息QPixmap pix = QPixmap(":/image/LevelCompletedDialogBg.png"); // 加载胜利对话框图片labelWin->setPixmap(pix); // 设置标签的图片labelWin->resize(pix.size()); // 设置标签的大小labelWin->show(); // 显示胜利信息labelWin->move(this->width()/2-labelWin->width()/2,-labelWin->height()); // 初始位置设在屏幕外QPropertyAnimation *animation = new QPropertyAnimation(labelWin, "geometry",this); // 创建胜利标签动画animation->setStartValue(labelWin->geometry());  // 设置动画的起始位置animation->setEndValue(QRect(labelWin->x(),  labelWin->y()+180,  labelWin->width(), labelWin->height())); // 设置动画的结束位置animation->setDuration(1000);  // 设置动画的持续时间animation->setEasingCurve(QEasingCurve::OutBounce); // 设置动画的缓动曲线animation->start(QPropertyAnimation::DeleteWhenStopped); // 启动动画并在结束时删除
}void PlayScene::paintEvent(QPaintEvent *event) // 重写 paintEvent 绘制自定义元素
{QPainter painter(this); // 创建 QPainter 对象用于绘制painter.translate(0,this->menuBar()->height()); // 移动绘制区域到菜单栏下方QPixmap pix(":/image/PlayLevelSceneBg.png"); // 加载背景图片painter.drawPixmap(0, 0, this->width(), this->height(), pix); // 绘制背景图片填充整个窗口pix.load(":/image/Title.png"); // 加载logo图片pix = pix.scaled(pix.width()/2,pix.height()/2); // 缩放logo图片50%painter.drawPixmap(0,0,pix); // 在窗口左上角绘制标题图片
}

 mypushbutton.h

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H#include <QWidget> // 引入 QWidget 头文件,用于继承 QWidget
#include <QPushButton> // 引入 QPushButton 头文件,用于继承 QPushButtonclass MyPushButton : public QPushButton // 定义 MyPushButton 类,继承自 QPushButton
{Q_OBJECT // 宏,启用 Qt 的信号与槽机制
public:enum MyPushButtonStat // 定义枚举类型 MyPushButtonStat,用于按钮状态{NORMAL, // 正常状态PRESSED // 按下状态};MyPushButton(QString normalImg, QString pressedImg, QWidget *parent = nullptr); // 构造函数声明,接受正常和按下状态的图片路径,以及父级 widgetvoid moveDown(); // 移动按钮向下的函数声明void moveUp(); // 移动按钮向上的函数声明protected:void paintEvent(QPaintEvent *event); // 重写 paintEvent 函数,用于自定义绘制void mousePressEvent(QMouseEvent *e); // 重写 mousePressEvent 函数,用于处理鼠标按下事件void mouseReleaseEvent(QMouseEvent *e); // 重写 mouseReleaseEvent 函数,用于处理鼠标释放事件signals:private:QString mNormalImg; // 存储正常状态图片路径QString mPressedImg; // 存储按下状态图片路径MyPushButtonStat mStat; // 存储当前按钮状态
};#endif // MYPUSHBUTTON_H

 mypushbutton.cpp

#include "mypushbutton.h" // 引入自定义按钮类的头文件
#include <QPainter> // 引入 QPainter 头文件,用于绘图
#include <QPropertyAnimation> // 引入 QPropertyAnimation 头文件,用于动画效果// 构造函数,初始化按钮的正常图片和按下图片路径
MyPushButton::MyPushButton(QString normalImg, QString pressedImg, QWidget *parent): QPushButton{parent} // 调用基类 QPushButton 的构造函数, mNormalImg(normalImg) // 初始化正常状态图片路径, mPressedImg(pressedImg) // 初始化按下状态图片路径
{mStat = NORMAL; // 设置按钮的初始状态为正常状态
}// 动画下跳
void MyPushButton::moveDown()
{QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry", this); // 创建动画对象,作用于按钮的几何属性animation->setStartValue(this->geometry()); // 设置动画起始位置为当前按钮位置animation->setEndValue(QRect(this->x(), this->y() + 10, this->width(), this->height())); // 设置动画结束位置为下移10像素后的按钮位置animation->setDuration(100); // 设置动画持续时间为100毫秒animation->start(QPropertyAnimation::DeleteWhenStopped); // 动画结束后自动删除
}// 动画上跳
void MyPushButton::moveUp()
{QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry", this); // 创建动画对象,作用于按钮的几何属性animation->setStartValue(this->geometry()); // 设置动画起始位置为当前按钮位置animation->setEndValue(QRect(this->x(), this->y() - 10, this->width(), this->height())); // 设置动画结束位置为上移10像素后的按钮位置animation->setDuration(100); // 设置动画持续时间为100毫秒animation->start(QPropertyAnimation::DeleteWhenStopped); // 动画结束后自动删除
}void MyPushButton::paintEvent(QPaintEvent *event)
{// 绘制按钮图片QPainter painter(this); // 创建绘图对象QPixmap pix; // 创建 QPixmap 对象,用于加载图片if (mStat == NORMAL) // 判断当前状态是否为正常pix.load(mNormalImg); // 加载正常状态的图片if (mStat == PRESSED) // 判断当前状态是否为按下pix.load(mPressedImg); // 加载按下状态的图片painter.drawPixmap(0, 0, this->width(), this->height(), pix); // 绘制图片painter.drawText(0, 0, this->width(), this->height(), // 绘制文本Qt::AlignCenter | Qt::AlignVCenter, // 文本居中对齐this->text()); // 绘制按钮上的文本
}void MyPushButton::mousePressEvent(QMouseEvent *e)
{this->mStat = PRESSED; // 设置按钮状态为按下update(); // 触发重绘事件以更新按钮外观QPushButton::mousePressEvent(e); // 调用基类的鼠标按下事件处理函数
}void MyPushButton::mouseReleaseEvent(QMouseEvent *e)
{this->mStat = NORMAL; // 设置按钮状态为正常update(); // 触发重绘事件以更新按钮外观QPushButton::mouseReleaseEvent(e); // 调用基类的鼠标释放事件处理函数
}

 coinbutton.h

#ifndef COINBUTTON_H // 如果没有定义 COINBUTTON_H,则继续编译
#define COINBUTTON_H // 定义 COINBUTTON_H,防止重复包含#include <QWidget> // 引入 QWidget 基类
#include <QPushButton> // 引入 QPushButton 类
#include <QTimer> // 引入 QTimer 类class CoinButton : public QPushButton // 定义 CoinButton 类,继承自 QPushButton
{Q_OBJECT // 使用 Qt 的信号和槽机制public:explicit CoinButton(QWidget *parent = nullptr); // 构造函数,接收父窗口指针int getMstat() const; // 获取当前状态void setMstat(int newMstat); // 设置新的状态void flip(); // 执行翻转动画void setStatWithAnimation(int stat); // 设置状态并启动动画protected:void paintEvent(QPaintEvent *event); // 重写绘制事件函数private:int mstat; // 当前状态int mframe; // 当前帧数QTimer mtimer; // 定时器,用于控制动画帧更新signals:
};#endif // COINBUTTON_H // 结束条件编译指令

coinbutton.cpp

#include "coinbutton.h" // 引入自定义 CoinButton 类的头文件
#include <QPainter> // 引入 QPainter 头文件,用于绘图// 构造函数,初始化 CoinButton 对象
CoinButton::CoinButton(QWidget *parent): QPushButton{parent} // 调用基类 QPushButton 的构造函数
{this->setMstat(0); // 设置初始状态为银币this->setStyleSheet("QPushButton{border:0px;}"); // 设置按钮样式,去掉边框// 连接定时器超时信号到 lambda 函数,用于处理币翻转动画connect(&this->mtimer, &QTimer::timeout, [=]() {if (this->mstat) // 判断当前状态this->mframe--; // 状态为 1 时,银币转金币帧数减少elsethis->mframe++; // 状态为 0 时,金币转银币帧数增加// 根据当前帧数生成图片路径QString frameName = QString(":/image/Coin000%1.png").arg(this->mframe);this->setIcon(QIcon(frameName));// 如果帧数达到结束帧,即币翻转动画结束,停止定时器if (this->mframe == 8 || this->mframe == 1){this->mtimer.stop();}});
}// 获取当前状态
int CoinButton::getMstat() const
{return mstat; // 返回状态
}// 设置新的状态
void CoinButton::setMstat(int newMstat)
{mstat = newMstat; // 更新状态// 根据状态设置按钮图标if (this->mstat)this->setIcon(QIcon(":/image/Coin0001.png")); // 状态为 1 时,显示第 1 帧,为金币elsethis->setIcon(QIcon(":/image/Coin0008.png")); // 状态为 0 时,显示第 8 帧,为银币this->setIconSize(this->size()); // 设置图标大小为按钮的大小
}// 执行翻转动画
void CoinButton::flip()
{this->setStatWithAnimation(!this->mstat); // 切换状态并启动动画
}// 设置状态并启动动画
void CoinButton::setStatWithAnimation(int stat)
{this->mstat = stat; // 更新状态// 根据新的状态设置初始帧数if (this->mstat)this->mframe = 8; // 状态为 1 时,从第 8 帧开始,银转金elsethis->mframe = 1; // 状态为 0 时,从第 1 帧开始,金转银this->mtimer.start(30); // 启动定时器,设置帧更新间隔为 30 毫秒
}// 绘制事件,重写 QPushButton 的 paintEvent
void CoinButton::paintEvent(QPaintEvent *event)
{// 绘制背景图片QPainter painter(this); // 创建绘图对象QPixmap pix(":/image/BoardNode.png"); // 加载背景图片// 指定背景图宽度和高度为按钮的宽度和高度painter.drawPixmap(0, 0, this->width(), this->height(), pix);QPushButton::paintEvent(event); // 调用基类的绘制事件函数
}

dataconfig.h

#ifndef DATACONFIG_H
#define DATACONFIG_H#include <QObject>
#include <QMap>
#include <QVector>class dataConfig : public QObject
{Q_OBJECT
public:explicit dataConfig(QObject *parent = 0);public:QMap<int, QVector< QVector<int> > >mData;signals:public slots:
};#endif // DATACONFIG_H

dataconfig.cpp

#include "dataconfig.h"
#include <QDebug>
dataConfig::dataConfig(QObject *parent) : QObject(parent)
{int array1[4][4] = {{1, 1, 1, 1},{1, 1, 0, 1},{1, 0, 0, 0},{1, 1, 0, 1} } ;QVector< QVector<int>> v;for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array1[i][j]);}v.push_back(v1);}mData.insert(1,v);int array2[4][4] = { {1, 0, 1, 1},{0, 0, 1, 1},{1, 1, 0, 0},{1, 1, 0, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array2[i][j]);}v.push_back(v1);}mData.insert(2,v);int array3[4][4] = {  {0, 0, 0, 0},{0, 1, 1, 0},{0, 1, 1, 0},{0, 0, 0, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array3[i][j]);}v.push_back(v1);}mData.insert(3,v);int array4[4][4] = {   {0, 1, 1, 1},{1, 0, 0, 1},{1, 0, 1, 1},{1, 1, 1, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array4[i][j]);}v.push_back(v1);}mData.insert(4,v);int array5[4][4] = {  {1, 0, 0, 1},{0, 0, 0, 0},{0, 0, 0, 0},{1, 0, 0, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array5[i][j]);}v.push_back(v1);}mData.insert(5,v);int array6[4][4] = {   {1, 0, 0, 1},{0, 1, 1, 0},{0, 1, 1, 0},{1, 0, 0, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array6[i][j]);}v.push_back(v1);}mData.insert(6,v);int array7[4][4] = {   {0, 1, 1, 1},{1, 0, 1, 1},{1, 1, 0, 1},{1, 1, 1, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array7[i][j]);}v.push_back(v1);}mData.insert(7,v);int array8[4][4] = {  {0, 1, 0, 1},{1, 0, 0, 0},{0, 0, 0, 1},{1, 0, 1, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array8[i][j]);}v.push_back(v1);}mData.insert(8,v);int array9[4][4] = {   {1, 0, 1, 0},{1, 0, 1, 0},{0, 0, 1, 0},{1, 0, 0, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array9[i][j]);}v.push_back(v1);}mData.insert(9,v);int array10[4][4] = {  {1, 0, 1, 1},{1, 1, 0, 0},{0, 0, 1, 1},{1, 1, 0, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array10[i][j]);}v.push_back(v1);}mData.insert(10,v);int array11[4][4] = {  {0, 1, 1, 0},{1, 0, 0, 1},{1, 0, 0, 1},{0, 1, 1, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array11[i][j]);}v.push_back(v1);}mData.insert(11,v);int array12[4][4] = {  {0, 1, 1, 0},{0, 0, 0, 0},{1, 1, 1, 1},{0, 0, 0, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array12[i][j]);}v.push_back(v1);}mData.insert(12,v);int array13[4][4] = {    {0, 1, 1, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 1, 1, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array13[i][j]);}v.push_back(v1);}mData.insert(13,v);int array14[4][4] = {    {1, 0, 1, 1},{0, 1, 0, 1},{1, 0, 1, 0},{1, 1, 0, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array14[i][j]);}v.push_back(v1);}mData.insert(14,v);int array15[4][4] = {   {0, 1, 0, 1},{1, 0, 0, 0},{1, 0, 0, 0},{0, 1, 0, 1}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array15[i][j]);}v.push_back(v1);}mData.insert(15,v);int array16[4][4] = {   {0, 1, 1, 0},{1, 1, 1, 1},{1, 1, 1, 1},{0, 1, 1, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array16[i][j]);}v.push_back(v1);}mData.insert(16,v);int array17[4][4] = {  {0, 1, 1, 1},{0, 1, 0, 0},{0, 0, 1, 0},{1, 1, 1, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array17[i][j]);}v.push_back(v1);}mData.insert(17,v);int array18[4][4] = { {0, 0, 0, 1},{0, 0, 1, 0},{0, 1, 0, 0},{1, 0, 0, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array18[i][j]);}v.push_back(v1);}mData.insert(18,v);int array19[4][4] = {   {0, 1, 0, 0},{0, 1, 1, 0},{0, 0, 1, 1},{0, 0, 0, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array19[i][j]);}v.push_back(v1);}mData.insert(19,v);int array20[4][4] = {  {0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}} ;v.clear();for(int i = 0 ; i < 4;i++){QVector<int>v1;for(int j = 0 ; j < 4;j++){v1.push_back(array20[i][j]);}v.push_back(v1);}mData.insert(20,v);//测试数据
//    for( QMap<int, QVector< QVector<int> > >::iterator it = mData.begin();it != mData.end();it++ )
//    {
//         for(QVector< QVector<int> >::iterator it2 = (*it).begin(); it2!= (*it).end();it2++)
//         {
//            for(QVector<int>::iterator it3 = (*it2).begin(); it3 != (*it2).end(); it3++ )
//            {
//                qDebug() << *it3 ;
//            }
//         }
//         qDebug() << endl;
//    }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型时代,云南白药如何成为一家AI医药企业?|产业AI案例

作者|斗斗 编辑|皮爷 出品|产业家 中医药大模型发布&#xff1b;英伟达成立AI制药部门&#xff0c;发力生物制药领域&#xff1b;赛诺菲与百图生科达成战略合作&#xff0c;共同开发用于生物治疗药物发现的领先模型&#xff1b;京东发布医疗大模型&#xff1b;百度“产业级”…

读软件开发安全之道:概念、设计与实施04缓解

1. 缓解 1.1. 安全思维转换为有效行动的方法就是首先预判威胁&#xff0c;然后针对可能的漏洞加以保护 1.2. 主动响应的做法就叫做“缓解” 1.2.1. mitigation 1.2.2. 喂宝宝的时候给孩子围上围嘴&#xff0c;避免掉下来的食物粘在宝宝的衣服上&#xff0c;还有安全带、限速…

ID3算法详解:构建决策树的利器

目录 引言 ID3算法概述 算法基础 信息熵 ​编辑 信息增益 ID3算法步骤 决策树 概念: 核心&#xff1a; 节点 1. 根节点 2. 非叶子节点 3. 叶子节点 引言 在机器学习领域&#xff0c;决策树是一种非常流行的分类和回归方法。其中&#xff0c;ID3算法作为决策树算法…

jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目

各位小伙伴们大家好呀&#xff0c;我是小金&#xff0c;本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目&#xff0c;之前没怎么搞过部署相关的&#xff0c;以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题&#xff0c;特写此篇&#xff0…

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

Linux驱动开发基础(设备树)

所学来自百问网 目录 1. 引入设备树的原因 2. 设备树语法 2.1 Devicetree格式 2.1.1 DTS文件格式 2.1.2 node的格式 2.1.3 properties的格式 2.1.4 dts 文件包含dtsi文件 2.2 常用属性 2.2.1 #address-cells、#size-cells 2.2.2 compatible 2.2.3 model 2.2.4 st…

一步解决Ubuntu中/mnt/hgfs无共享文件夹的问题

当我们启用了共享文件夹后&#xff0c;但是在终端/mnt/hgfs任然没有文件 在终端输入 sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other 之后&#xff0c;就可以查到共享文件了

复现 LET-NET

摘要 稀疏光流法是计算机视觉中的一项基本任务。然而&#xff0c;它依赖于恒定的假设限制了其在高动态范围&#xff08;HDR&#xff09;场景中的适用性。在本研究中&#xff0c;我们提出了一种新的方法&#xff0c;旨在通过学习一个对光照变化具有鲁棒性的特征映射来超越图像的…

KubeSphere核心实战_kubesphere部署redis01_为redis指定配置文件_指定存储卷_配置服务---分布式云原生部署架构搭建047

然后我们再来,部署一下redis,可以看到,首先去容器官网去找到对应的redis的镜像然后 可以看到镜像中都有说的,如何启动,以及 --appendonly yes 是指定持久化.然后 /data表示数据存储的位置. 可以看到数据存储位置 然后还有配置文件的位置. 可以看到,我们首先去创建配置文件,然后…

LNMP 架构(Linux+NGINX+memcache+PHP)

目录 1 源码编译PHP与NGINX 1.1 NGINX 源码编译 1.2 PHP 源码编译安装 2 实现PHP与NGINX的连接 2.1 php-fpm的详细介绍 2.2 LNMP与LAMP的区别 2.3 PHP配置文件的介绍 2.4 实例实现php-fpm 与 NGINX的连接 2.4.1 指定pid的存放位置 2.4.2 php-fpm设置监听自己端口与IP 2.4.3 主配…

配置 昇腾 Ascend C/C++ 开发环境

配置 昇腾 Ascend C/C 开发环境 flyfish 这里以Orange Pi Ai Pro 为例 先说如何配置MindStudio&#xff0c;然后再说如何查看Orange Pi Ai Pro的一些信息 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;其搭载了昇腾 AI 处理器。Linux 桌面…

VSCode系列 - 如何用VSCode搭建C++高效开发环境(2)

1. 插件的用法 1.1. C/C 1.1.1. 插件介绍1.1.2. 插件配置 1.2. Clang-Format1.3. cpp-check-lint 1.3.1. cpplint1.3.2. cppcheck1.3.3. 插件的使用 1.4. C/C Advanced Lint 1.4.1. 插件介绍1.4.2. 插件配置 1.5. Bracket Pair Colorizer 1.5.1. 插件介绍1.5.2. 功能配置 1.6. …

【机器学习】探索机器学习在旅游业的革新之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习在旅游需求分析中的应用&#x1f31e;用户行为数据分析&#x1f319;旅客偏好预测模型⭐…

Java面试八股之如何保证消息队列中消息不重复消费

如何保证消息队列中消息不重复消费 要保证消息队列中的消息不被重复消费&#xff0c;通常需要从以下几个方面来着手&#xff1a; 消息确认机制&#xff1a; 对于像RabbitMQ这样的消息队列系统&#xff0c;可以使用手动确认&#xff08;manual acknowledge&#xff09;机制来…

C++ 设计模式——策略模式

策略模式 策略模式主要组成部分例一&#xff1a;逐步重构并引入策略模式第一步&#xff1a;初始实现第二步&#xff1a;提取共性并实现策略接口第三步&#xff1a;实现具体策略类第四步&#xff1a;实现上下文类策略模式 UML 图策略模式的 UML 图解析 例二&#xff1a;逐步重构…

【c语言】整数在内存中的储存(大小端字节序)

整数在内存中的储存&#xff08;大小端字节序&#xff09; 1.整数在内存中的储存 2.大小端字节序 3.整数在内存中储存例子 4.字节序判断 5.死循环现象 文章目录 整数在内存中的储存&#xff08;大小端字节序&#xff09;整数在内存中的储存大小端字节序什么是大小端为什么会有…

Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

1.怪物的动画逻辑一览 2.怪物的受伤死亡逻辑一览 using System.Collections; using System.Collections.Generic; using System.Xml; using UnityEngine;public class Monster : MonoBehaviour {[Header("速度")]public float normalSpeed;public float chaseSpeed;…

在国产芯片上实现YOLOv5/v8图像AI识别-【2.5】yolov8使用C++部署在RK3588更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 背景…

nginx简介及功能

一、简介&#xff1a; 1、nginx、apache是什么&#xff1f; ‌Nginx‌是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。它由伊戈尔赛索耶夫为Rambler.ru站点开发&#xff0c;以其稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而…

OSI七层网络模型 /TCP/IP五层模型以及封装分用的详细讲解

文章目录 协议分层的好处OSI七层网络模型TCP/IP五层网络模型网络设备所在的分层(重点)封装和分用 协议分层的好处 第一点&#xff1a; 在网络通信中&#xff0c;如果使用一个协议来解决所有的问题&#xff0c;那么这个协议就会非常的庞大&#xff0c;非常不利于去学习和理解&…