• 关于QT6实现翻金币小程序的避坑指南


    QT6实现翻金币小程序的避坑指南

    原教学视频说明:https://www.bilibili.com/video/BV1g4411H78N/?spm_id_from=333.337.search-card.all.click&vd_source=442624ae292ec6b8a3ceccecdfccf14f
    本文源码及素材:https://github.com/FifthIntelligence/ReturnCoin

    注意:本游戏是相较于原视频游戏的一个变形,本篇记录的亮点在于:

    1. 使用QT6编写,音频控制等多个细节存在与QT5不一致,属于新知识;
    2. 素材为本人网上收集及加工处理,素材尺寸及位置与视频中不一样,存在一定挑战性;
    3. 在本次开发中,存在的bug及软件操作的问题,本文已记录。

    一、作品预览

    1. 演示视频

    ReturnCoin-vedio

    1. 素材截图
      在这里插入图片描述
    2. 运行截图
      在这里插入图片描述

    二、游戏功能介绍

    1. 点击图标后进入首页,背景音乐响起;
    2. 点击开始游戏后进入关卡选择页,共20个关卡;
    3. 选择关卡进入游戏页面,4*4矩阵,共16个金币;
    4. 翻其中一个金币,带动周围上下左右金币翻转,每个金币有正面和反面;
    5. 当16个金币全部是金色后游戏获胜,弹出胜利标志,胜利音乐响起;
    6. 翻金币与点击按钮皆有音效;
    7. 游戏界面左下角有关卡说明;
    8. 选择关卡界面、游戏界面存在返回按钮,点击返回上一个场景。

    三、游戏脉络梳理

    这里呈上一张UML图,代码的话就不铺天盖地的讲解了。

    1. 预览图
      在这里插入图片描述
    2. 局部放大图(1)
      在这里插入图片描述
    3. 局部放大图(2)

    在这里插入图片描述
    4. 局部放大图(3)
    在这里插入图片描述

    四、QT6开发中的注意事项

    1. Qt Creator 显示乱码,我这里有这几个对策,定有一条适合你:
      (1) 如果print是乱码;
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      UTF-8是比GBK更宽的字符集,选UTF-8准错不了。

    (2)如果print不是乱码,但qDebug()是乱码;
    试试在main函数加入这几句(重定向到print):

    qInstallMessageHandler([](QtMsgType, const QMessageLogContext& context, const QString& msg) {
        std::cout << msg.toStdString() << std::endl;
    });
    qDebug() << "你好";
    
    • 1
    • 2
    • 3
    • 4

    (3)使用英文开发和注释,乱码终结者!
    2. QT creater 11.0.2版本创建在项目中创建类后自动崩溃
    这个问题我屡试不爽,暂时没有解决思路,好在这次开发中的类不多,若你有思路可以给我留言。
    我的出错环境是:QT creater 11.0.2 + CMake.
    3. QT添加资源后程序总是找不到,也没法使用,一定要编译一下,看到左边的qrc文件展开后有自己想要的文件后才可以
    4. 关于QT新建项目显示无法找到ui_xx.h的时候,重启一下Qt就好了(新建UI类后修改完记得保存,要不就会出现这种情况)
    5. 关于文件的读写,C有一套、C++有一套(ifream和ofream)、QT中也有一套(QFile),精通一套就行
    6. 中途遇到了一个QPixmap图片载入的问题,耽误了不少时间,仔细一看,竟然是路径中的冒号是中文冒号

    错误示范:":/res/BackButton.png"
    
    • 1
    正确示范:":/res/BackButton.png"
    
    • 1

    MarkDown编辑器都比QT编辑器更好分辨这个错误,更重要的是QT不提醒,大家一定切记切记。
    7. 在重写事件时函数名称一定不能写错,要不这bug够找半天的了
    在这里插入图片描述
    8. QT没法直接给字体上色,但是可以他通过QPalete实现,代码如下:

    QLabel * label = new QLabel;
    label->setParent(this);
    QPalette palette;
    palette.setColor(QPalette::WindowText, Qt::red); // 设置字体颜色为红色
    label->setPalette(palette);
    QFont font;
    font.setFamily("华文新魏");
    font.setPointSize(20);
    label->setFont(font);
    QString str_1 = QString("Leavel: %1").arg(this->levelIndex);
    label->setText(str_1);
    label->setGeometry(QRect(30, this->height() - 50, 150, 50));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. QT6对音频的操作是QSoundEffect
    // prepare the start button audio
    QSoundEffect *startSound = new QSoundEffect(this);
    startSound->setSource(QUrl::fromLocalFile(":/res/TapButtonSound.WAV"));
    startSound->setVolume(0.3);
    startSound->play();     // play the audio
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果需要设置无限循环,则需要这样,更多内容可以在帮助文档里查找:

    BGmusic->setLoopCount(QSoundEffect::Infinite);
    
    • 1
    1. QSoundEffect只播放WAV文件,切记切记,别再整什么MP3;
    2. 文件名是BG.WAV,但程序的路径这么写:
    ":/res/BG.wav"
    
    • 1

    会导致音频文件无法解析,因为大小写不一样。
    12. 设置背景图片的透明度,可以使用QGraphicsOpacityEffect ,这串代码只看最后三句就行

      // create coin background
      QPixmap pix = QPixmap(":/res/BoardNode.png");
      pix = pix.scaled(pix.width()*1.5, pix.height()*1.5);
      QLabel *label = new QLabel;
      label->setGeometry(0, 0, pix.width(), pix.height());
      label->setPixmap(pix);
      label->setParent(this);
      label->move(330 + i*85, 170 + j*85);
      QGraphicsOpacityEffect *effect = new QGraphicsOpacityEffect();  // set label opacity
      effect->setOpacity(0.6);
      label->setGraphicsEffect(effect);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    五、游戏开发过程中的一些个人建议

    1. 一定要看QT开发文档,如果薪资想要提升一个层次,开发文档必不可少。
      QT的开发文档参考这个路径:
    D:\Qt\Tools\QtDesignStudio\qt6_design_studio_reduced_version\bin
    
    • 1

    直接将它固定在电脑开始菜单上,可以随时打开:
    在这里插入图片描述
    那么问题来了,如果打开后什么文档也没有,可以试试这个方法:

    在这里插入图片描述
    遇到什么问题就在这里搜,第一手的解释信息:
    在这里插入图片描述
    2. QT快捷键:Ctrl+Alt+向上键、Ctrl+Alt+向下键分别是向上向下复制,很常用;
    3. 鼠标穿透属性:WA_TransparentForMouseEvents,可以用这个在文档中搜索。


    若有任何问题,欢迎评论或私信!

  • 相关阅读:
    leetcode每天5题-Day33
    X-ray diffraction
    3D 世界的钥匙「GitHub 热点速览 v.22.08」
    Masked AutoEncoder论文及实现
    Windows用户真实最后登录报表
    Linux常用命令——帮助命令
    【Elasticsearch教程5】Mapping 动态模板 Dynamic templates
    [ Linux ] 重定向的再理解,以及文件系统的理解、inode和软硬链接
    splay平衡树
    3.6 OrCAD中元器件应该怎么进行镜像与翻转?
  • 原文地址:https://blog.csdn.net/Lanyan9/article/details/134546138