经过2个月的不休不止编写,终于完成了QAudioWave,

主要实现的功能为:打开音频文件wav格式,播放,暂停,停止,显示播放时间,放大,缩小,剪切,粘贴,复制,保存,显示全部,全选,反转,放大器+,

放大器-,淡入,淡出,压缩,插入静音,选取区域音量+-,滚动条,时间显示,波形,单双通道显示等。

Qt-音频编辑 QAudioWave_虚函数

下面简单介绍几个功能:

放大缩小:

Qt-音频编辑 QAudioWave_虚函数_02

选取:

Qt-音频编辑 QAudioWave_数据_03

淡入淡出:

Qt-音频编辑 QAudioWave_虚函数_04

其他功能,就不截图了,比如播放,播放滚动显示等,截图显示不出来。

#ifndef QAUDIOWAVE_H
#define QAUDIOWAVE_H

#include <QWidget>
#include <QPainter>
#include <QColor>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QResizeEvent>
#include "audioplaythread.h"
#include "wavedatathread.h"
#include "qcscrollbar.h"

class QAudioWave : public QWidget
{
Q_OBJECT
enum PASSAGEWAY_NUM {//宏定义通道
PASSAGEWAY_1,
PASSAGEWAY_2
};
enum AUDIO_PLAY_STATE{//定义播放暂停
AUDIO_PLAY_PLAY,
AUDIO_PLAY_STOP,
AUDIO_PLAY_INIT
};
public:
explicit QAudioWave(QWidget *parent = 0);
~QAudioWave();
protected:
void paintEvent(QPaintEvent *); //绘图事件
void drawBg(QPainter *painter); //画背景
void drawTimeLine(QPainter *painter); //画时间
void drawData(QPainter *painter); //画数据
void drawCutArea(QPainter *painter); //画截取区域
void drawScale(QPainter *painter); //画卡尺
void drawEveryLine(QPainter *painter); //画时时线
void drawRightDb(QPainter *painter); //画db线
virtual void wheelEvent(QWheelEvent *event); //重写虚函数获取事件
virtual void mouseMoveEvent(QMouseEvent *event); //重写虚函数获取事件
virtual void mousePressEvent(QMouseEvent *event); //重写虚函数获取事件
virtual void mouseReleaseEvent(QMouseEvent *event); //重写虚函数获取事件
virtual void resizeEvent(QResizeEvent *event); //重写虚函数获取事件

protected:
void thisUpdate(); //刷新
QString conversionTimeToStr(qint32); //时间换算
void cutAreaPross();//选取区域放大缩小处理

signals:
void sendRecordWheel(qint32); //发送滚轮
void sendScrollBarValueChanged(qint32);//滚动条改变
void sendEveryLinePointChanged(qint32);//点击改变时时线位置
void sendMouseLeftPress(qint32); //鼠标点击
void sendMouseLeftRelease(qint32); //鼠标点击
void sendAudioPlayerSignal(qint8);//播放停止信号
void sendWavPlayPath(QString);//发送文件路径
void sendSaveWavPlayPath(QString);//发送文件路径
void sendRecordPlayTimeNum(QString);//返回播放时间
void sendRecordPlayNum(qint32);//播放到位置
void sendCopySignal();//复制
void sendPasteSignal();//粘贴
void sendShearSignal();//剪切
void sendReversalSignal();//反转
void sendFadeInSignal();//淡入
void sendFadeOutSignal();//淡出
void sendInsertMuteSignal(qint32);//插入静音
void sendVolumeAddSignal();//音量加
void sendVolumeReduceSignal();//音量减
void sendAmplifierAddSignal();//放大器加
void sendAmplifierReduceSignal();//放大器减

public:
void setQScrollBarRange(int min, int max); //设置滚动条最大最小值

public slots:
void acceptMousePressSignal();//接受滚动条按下
void acceptMouseReleaseSignal();//接受滚动条释放
void onSliderChanged(int);//
void acceptSliderChanged(double);//
void acceptRecordEveryLinePoint(qint32 recordEveryLinePoint); //接收时时线位置
void acceptRecordDrawDateTimeStart(double); //接收绘图区域起始时间左声道
void acceptRecordDrawDateTimeEnd(double); //接收绘图区域结束时间左声道
void acceptPaintPoints_R(QVector<QPointF> points); //接受线程返回数据
void acceptPaintPoints_L(QVector<QPointF> points); //接受线程返回数据
void acceptChannelCount(qint8); //接受通道数
void acceptWavFilePath(QString );
void acceptSaveWavFilePath(QString );
void acceptAudioPlayerSignal(qint8);
void acceptCopySignals();//接受复制
void acceptPasteSignals();//接受粘贴
void acceptShearSignals();//接受剪切
void acceptNarrowSignals();//接受缩小
void acceptEnlargeSignals();//放大
void acceptDisplayAllSignals();//显示全部
void acceptSeleteAllSignals();//选取全部
void acceptReversalSignals();//选取反转
void acceptFadeInSignals();//选取淡入
void acceptFadeOutSignals();//选取淡出
void acceptInsertMuteSignals(qint32);//插入静音ms
void acceptVolumeAddSignals();//音量+
void acceptVolumeReduceSignals();//音量-
void acceptAmplifierAddSignals();//放大器+
void acceptAmplifierReduceSignals();//放大器-
private:
QPainterPath smoothCurvePath;
PASSAGEWAY_NUM recordPassageway; //单双通道 1 ,2
AUDIO_PLAY_STATE playstate = AUDIO_PLAY_INIT;
QColor foreground; //前景色
QColor background; //背景色
QColor girdLineGround; //网格线背景色
QColor everyLineColor; //时时线颜色
QColor cutAreaColor; //截取区域颜色
QColor scaleLineColor; //截取区域颜色
double everyLineWidth = 0; //时时线宽
double girdLineWidth = 0; //网格线粗细
qint32 recordWheel = 0; //记录滚轮
qint32 recordLastWheel = 0; //记录滚轮
double recordDrawDateTimeStart = 0; //记录绘图区域数据起始时间,以10毫秒为单位
double recordDrawDateTimeEnd = 0; //记录绘图区域数据结束时间,以10毫秒为单位
qint32 recordEveryLinePoint = 0; //时时线位置
double recordCutStart = 0; //记录截取起始位置
double recordCutEnd = 0; //记录截取结束位置
bool cutAreaState = false; //记录截取绘图状态
bool displayCutAreaState = false; //记录显示截取绘图状态
bool cutAreaLenthState = false; //记录截取绘图长度状态
bool allEventState = false; //所有事件状态
bool horizontalScrollBarValueChangedState = false; //所有事件状态
QCScrollBar *horizontalScrollBar = Q_NULLPTR; //滚动条
QString wavefilepath; //文件路径
QVector<QPointF> points_L; //划线点
QVector<QPointF> points_R; //划线点
double m_SamplesPerPixel = 0;
double m_ZoomFactor = 0;

AudioPlayThread *wavPlayer;
QThread wavPlayerThread;
WaveDataThread *DateThreadObject; //线程处理对象
QThread DateThread; //线程
};

#endif // QAUDIOWAVE_H