基于QT实现的钢琴软件 (MFC大作业)

2023-10-29

 作品内容:

基于Qt平台开发的一款钢琴模拟器,主要完成了对钢琴的全键全音调模拟,使用者可以在电脑上通过28个键完成钢琴曲的演奏。另外,我们还添加了延音、变调、录音、播放、教程等功能,旨在为用户提供完整的电脑钢琴体验。

软件外观:

实现思路:

  • 整体框架的构建

首先肯定是要有一个承载钢琴键的载体(mainWidow),在其中构建了88个PianoKey类的琴键,这个过程中比较重要的有两个步骤,一个是底层背景以及菜单栏的构建,这两个我们调用了Qt提供的类如QPainter等类以及其成员函数,构建了软件框架及背景,其次是其中钢琴键图像的呈现,我们在PianoKey类中添加了初始化图像的函数语句(因为其本质是一个按钮,所以可以通过设置按钮的图标即可实现。

  • 钢琴弹奏的动态实现

钢琴弹奏一共有两个要点,一是音频,二是动画。

首先,当相应的按键消息进入MainWindow时,其中的KeyPress以及KeyRelease函数(重载其父类的虚函数)会识别相应的按键消息,比如对按键Key_T,窗口识别其按键消息后会调用音频播放以及动画动作的函数,从而实现演奏功能。

其中,钢琴声音的实现我们是使用了Qt提供的QSound类,对每一个键初始化了一个音频文件,当按键消息处理时,我们会播放这个文件。

然后是动画的实现,我们的按键“按下”和“弹起”的动画是通过图片的切换实现的,就是在Press的处理函数中加载按下后的琴键图片,在Release的处理中加载琴键平时状态的图片。

还有有些细节,比如Tab键和Space键是不能在KeyPress函数中响应的,因为系统已经将其使用了(Tab是窗口切换),我们在事件分发的底层装了一个“过滤器”——eventFilter,从而实现了对这两个键的使用。

  • 音调的切换

我们只使用了电脑键盘的28个,这意味着我们不同一次性弹奏88个键,解决办法就是切换音调。音调的切换是通过音调类“Tone”以及其派生出的15个子类实现的,音调的切换其实就是父类指针指向不同的子类,使用不同子类中初始化的音频文件,从而实现了同一个按键,不同音调下对应的钢琴键不同,当然动画也会响应改变。

  • 录制和播放

录制的过程其实是重载>>以及<<运算符之后,在按键处理函数中加入写入文件的语句即可,录制的按键特征主要有时间刻度、音频文件名称、是否延音。播放的实现流程是,先将录制好的文件中的信息读入到这个链表类(Record_list)的对象中,然后用“出队”的相似流程,对每一个音频信息处理并播放,其中使用了一个定时器,经过两个连续音频的时间差值之后,时间上溢,触发timeout信号,播放音频及按键动画。

  • 新手教程等菜单栏功能

这一部分主要是对Qt提供的ui界面编辑器的使用,并用connect语句连接相应的功能函数,从而实现弹出对话框等动作。

测试过程:弹奏、播放和录音的测试可以在使用中测试。

结果是

弹奏功能在不同机型下的流畅度会有所不同,其本质是处理器的差别(我们使用了多线程)多核的处理器会更流畅,相关按键的基本功能始终存在(包括切换音调,延音状态)。

录制功能也能顺利实现,成功的记录所弹奏曲目的信息,播放功能测试时有点问题是,在播放的同时不能弹奏,否则会出现闪退的情况,原因是程序在调用函数时,按键消息的进入会被阻塞,从而出现crash的冲突处理,函数异常退出,程序闪退。

其他功能都能顺利实现,加载需要20s左右。

https://mbd.pub/o/bread/mbd-YpeUlppy

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于QT实现的钢琴软件 (MFC大作业) 的相关文章

  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 如何在 MFC 中创建带圆角的进度控件?

    我需要在 MFC 应用程序中创建一个带圆角的进度条 我尝试过使用 CreateRoundRectRgn 和 SetWindowRgn 的组合 它具有使控件完全消失的效果 我还尝试使用透明的 GIF 覆盖层 该覆盖层将绘制在进度栏的顶部 但我
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 如何使QTableView类的restoreState()和saveState()正常工作?

    首先 我想说 我的问题已经在这里讨论过 并且这里是 https stackoverflow com questions 1163030 qt qtableview and horizontalheader restorestate 但答案并
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi

随机推荐

  • 如何确保网站的安全性

    大部分企业通过网站平台来进行信息发布 交流及宣传 推广企业业务 用户可以通过网站对企业进行初步的了解 并进一步获取咨询服务 企业网站不光是一个展示企业形象的平台 更是一种有效的营销方式 当然其安全性也是至关重要 随着网站的普遍应用 企业网站
  • 基于 STM32CubeMX 添加 RT-Thread 操作系统组件(四)- 多线程SRAM动态内存

    概述 本篇主要介绍这么使用STM32CubeMx工具添加RT Thread操作系统组件 码代码的IDE是keil 介绍单线程SRAM静态内存使用 如果还不知道 这么使用STM32CubeMx工具添加RT Thread操作系统组件 请移步到
  • PageRank算法 -- 从原理到实现

    本文整理自博文PageRank算法 从原理到实现 1 算法来源 这个要从搜索引擎的发展讲起 最早的搜索引擎采用的是 分类目录1的方法 即通过人工进行网页分类并整理出高质量的网站 那时 Yahoo 和国内的 hao123 就是使用的这种方法
  • Android学习笔记(五)--(可调节)模糊效果

    很多时候点开一个button的时候或者弹出某个提示的时候 背景都会变成模糊的或者说是虚化的 而今天 我们就来实现一下动态模糊效果 可以通过控制条或者手势来操控模糊程度 之前自己也做了一个 但是发现会有卡顿 在论坛逛了一会儿就发现果然有一个巧
  • 我的2020工作与学习总结

    我的2020总结 今天是2020年12月30日 马上就要开始新的一年了 在出差途中简单做个总结 总结我2020这平凡而又充实的一年 学习和生活方面 回忆起我去年做的总结我的2019 这两年都是收获满满 我19年大学毕业 其实目前我已经工作两
  • app客户端与服务器数据交互时—数据加密

    总结 1 对称加密加密与解密使用的是同样的密钥 所以速度快 但由于需要将密钥在网络传输 所以安全性不高 2 非对称加密使用了一对密钥 公钥与私钥 所以安全性高 但加密与解密速度慢 3 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密
  • vue json对象转数组_vue-vue-router 快速了解,多看看能扎实基础

    看着这么多房子头都晕了 不知道从哪里回家 概述 vue router是Vue js官方的路由插件 它和vue js是深度集成的 适合用于构建单页面应用 vue的单页面应用是基于路由和组件的 路由用于设定访问路径 并将路径和组件映射起来 传统
  • 03模板学习之函数模板案例-写一个int,char通用的冒泡

    03模板学习之函数模板案例 写一个int char通用的冒泡 1 直接看代码 模板测试 cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include
  • windows terminal使用git bash

    1 在微软应用商店下载 windows terminal 1 打开 Windows Terminnal 的设置界面 点击添加新配置文件添加配置如下 即在json配置文件中添加 commandline D Git bin bash exe l
  • ChatGPT的前世今生

    作者 符尧等 编辑 夕小瑶的卖萌屋 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 正文 最近 OpenAI的预训练模型ChatGPT给人工智能领域的研究人员留下了深刻的印
  • java中需要注意的一些代码编写规范

    一 编程规约 1 命名风格 常量命名全部大写 单词间用下划线隔开 力求语义表达完整清楚 不要嫌名字长 POJO 类中的任何布尔类型的变量 都不要加 is 前缀 否则部分框架解析会引起序列化错误 杜绝完全不规范的缩写 避免望文不知义 在常量与
  • 13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    题目的数据来源于50道SQL练习题及参考答案 原创 Hill GM的博客 CSDN博客 sql编程题目 建表和链接里面的是一样的 解决的思路 首先将每个学生的各科成绩放在同一行显示 select st sc1 score 语文 sc2 sc
  • vue3中使用echarts的子组件接收父级传来参数,并重新渲染 +++watch监听的用法

    1 父组件页面
  • java小说摸鱼

    import org jsoup Jsoup import org jsoup nodes Document import org jsoup nodes Element import java net HttpURLConnection
  • vs编译linux内核,VSCode远程开发Linux内核驱动

    受够了Vim的换台电脑就要倒腾N天配置的折磨 受够了Windows下Source Insight眼花的界面 这些软件虽然很多人在用 但是缺点也不少 然而Linux内核代码非常庞大 编译内核又需要在Linux下进行 有没有一种能在Window
  • TCL字符串操作

    format命令 因为 TCL 把所有的输入都当作字符串看待 所以 TCL 提供了较强的字符串操作功能 TCL 中与 字符串操作有关的命令有 string format regexp regsub scan 等 语法 format form
  • 【python】《多媒体技术与应用》实验报告「数字图像压缩」「傅里叶变换」

    多媒体技术与应用 实验报告 实验名称 实验二 数字图像压缩 实验时间 2022 4 11 姓名 班级 计非201 学号 成绩 实验目的 理解图像压缩的主要原则和目的 理解有损和无损压缩的概念 了解几种常用的图像压缩编码方法 利用 Pytho
  • Docker以Root启动的各种方法

    docker run itd user root name root user alpine sh docker run itd user 0 name root user2 alpine sh docker run itd name ro
  • Android Studio之maven Central,JCenter

    Android studio 是从哪里得到库的 Android Studio是从build gradle里面定义的Maven 仓库服务器上下载library的 Apache Maven是Apache开发的一个工具 提供了用于贡献librar
  • 基于QT实现的钢琴软件 (MFC大作业)

    作品内容 基于Qt平台开发的一款钢琴模拟器 主要完成了对钢琴的全键全音调模拟 使用者可以在电脑上通过28个键完成钢琴曲的演奏 另外 我们还添加了延音 变调 录音 播放 教程等功能 旨在为用户提供完整的电脑钢琴体验 软件外观 实现思路 整体框