Qt Charts_Audio实践

来源:互联网 发布:淘宝限时秒杀11元 编辑:程序博客网 时间:2024/05/21 04:44

这里完全是照搬帮助文档中的代码生成的程序


上预览图




工程文件代码

#-------------------------------------------------## Project created by QtCreator 2017-02-06T13:52:31##-------------------------------------------------QT       += core guiQT       += charts multimediagreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = qchart_Audio_ProjectTEMPLATE = appDEFINES += QT_DEPRECATED_WARNINGSSOURCES += main.cpp\        widget.cpp \    xyseriesiodevice.cppHEADERS  += widget.h \    xyseriesiodevice.hFORMS    += widget.uitarget.path = $$[QT_INSTALL_EXAMPLES]/charts/audioINSTALLS += target

widget.h文件代码

#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QtCharts/QChartGlobal>namespace Ui {class Widget;}QT_CHARTS_BEGIN_NAMESPACEclass QLineSeries;class QChart;QT_CHARTS_END_NAMESPACEQT_CHARTS_USE_NAMESPACEclass XYSeriesIODevice;class QAudioInput;class Widget : public QWidget{    Q_OBJECTpublic:    explicit Widget(QWidget *parent = 0);    ~Widget();private:    Ui::Widget *ui;    XYSeriesIODevice *m_device;    QChart *m_chart;    QLineSeries *m_series;    QAudioInput *m_audioInput;};#endif // WIDGET_H

widget.cpp代码

#include "widget.h"#include <QtMultimedia/QAudioDeviceInfo>#include <QtMultimedia/QAudioInput>#include <QtMultimedia/QAudioFormat>#include <QtCharts/QChartView>#include <QtCharts/QLineSeries>#include <QtCharts/QChart>#include <QtWidgets/QVBoxLayout>#include <QtCharts/QValueAxis>#include "xyseriesiodevice.h"#include "ui_widget.h"QT_CHARTS_USE_NAMESPACEWidget::Widget(QWidget *parent) :    QWidget(parent),m_device(0),    m_chart(0),    m_series(0),    m_audioInput(0),    ui(new Ui::Widget){    ui->setupUi(this);    m_chart = new QChart;    QChartView *chartView = new QChartView(m_chart);    chartView->setMinimumSize(800, 600);    m_series = new QLineSeries;    m_chart->addSeries(m_series);    QValueAxis *axisX = new QValueAxis;    axisX->setRange(0, 2000);    axisX->setLabelFormat("%g");    axisX->setTitleText("Samples");    QValueAxis *axisY = new QValueAxis;    axisY->setRange(-1, 1);    axisY->setTitleText("Audio level");    m_chart->setAxisX(axisX, m_series);    m_chart->setAxisY(axisY, m_series);    m_chart->legend()->hide();    m_chart->setTitle("Data from the microphone");    QVBoxLayout *mainLayout = new QVBoxLayout;    mainLayout->addWidget(chartView);    setLayout(mainLayout);    QAudioFormat formatAudio;    formatAudio.setSampleRate(8000);    formatAudio.setChannelCount(1);    formatAudio.setSampleSize(8);    formatAudio.setCodec("audio/pcm");    formatAudio.setByteOrder(QAudioFormat::LittleEndian);    formatAudio.setSampleType(QAudioFormat::UnSignedInt);    QAudioDeviceInfo inputDevices = QAudioDeviceInfo::defaultInputDevice();    m_audioInput = new QAudioInput(inputDevices,formatAudio, this);    m_device = new XYSeriesIODevice(m_series, this);    m_device->open(QIODevice::WriteOnly);    m_audioInput->start(m_device);}Widget::~Widget(){    m_audioInput->stop();    m_device->close();    delete ui;}

xyseriesiodevice.h代码

#ifndef XYSERIESIODEVICE_H#define XYSERIESIODEVICE_H#include <QtCore/QIODevice>#include <QtCharts/QChartGlobal>QT_CHARTS_BEGIN_NAMESPACEclass QXYSeries;QT_CHARTS_END_NAMESPACEQT_CHARTS_USE_NAMESPACEclass XYSeriesIODevice : public QIODevice{    Q_OBJECTpublic:    explicit XYSeriesIODevice(QXYSeries * series, QObject *parent = 0);protected:    qint64 readData(char * data, qint64 maxSize);    qint64 writeData(const char * data, qint64 maxSize);private:    QXYSeries *m_series;};#endif // XYSERIESIODEVICE_H

xyseriesiodevice.cpp代码


#include "xyseriesiodevice.h"#include <QtCharts/QXYSeries>XYSeriesIODevice::XYSeriesIODevice(QXYSeries * series, QObject *parent) :    QIODevice(parent),    m_series(series){}qint64 XYSeriesIODevice::readData(char * data, qint64 maxSize){    Q_UNUSED(data)    Q_UNUSED(maxSize)    return -1;}qint64 XYSeriesIODevice::writeData(const char * data, qint64 maxSize){    qint64 range = 2000;    QVector<QPointF> oldPoints = m_series->pointsVector();    QVector<QPointF> points;    int resolution = 4;    if (oldPoints.count() < range) {        points = m_series->pointsVector();    } else {        for (int i = maxSize/resolution; i < oldPoints.count(); i++)            points.append(QPointF(i - maxSize/resolution, oldPoints.at(i).y()));    }    qint64 size = points.count();    for (int k = 0; k < maxSize/resolution; k++)        points.append(QPointF(k + size, ((quint8)data[resolution * k] - 128)/128.0));    m_series->replace(points);    return maxSize;}



1 0
原创粉丝点击