Qt Charts_Audio实践

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

上预览图

image.png

工程文件代码

 

#-------------------------------------------------
#
# Project created by QtCreator 2017-02-06T13:52:31
#
#-------------------------------------------------
QT       += core gui
QT       += charts multimedia
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qchart_Audio_Project
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp\
        widget.cpp \
    xyseriesiodevice.cpp
HEADERS  += widget.h \
    xyseriesiodevice.h
FORMS    += widget.ui
target.path = $$[QT_INSTALL_EXAMPLES]/charts/audio
INSTALLS += target


widget.h文件代码

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtCharts/QChartGlobal>
namespace Ui {
class Widget;
}
QT_CHARTS_BEGIN_NAMESPACE
class QLineSeries;
class QChart;
QT_CHARTS_END_NAMESPACE
QT_CHARTS_USE_NAMESPACE
class XYSeriesIODevice;
class QAudioInput;
class Widget : public QWidget
{
    Q_OBJECT
public:
    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_NAMESPACE
Widget::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_NAMESPACE
class QXYSeries;
QT_CHARTS_END_NAMESPACE
QT_CHARTS_USE_NAMESPACE
class XYSeriesIODevice : public QIODevice
{
    Q_OBJECT
public:
    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;
}



目录
相关文章
|
4月前
|
设计模式 缓存 编译器
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
203 4
|
4月前
|
Linux API C语言
Qt串口编程探究:理论与实践
Qt串口编程探究:理论与实践
240 1
|
4月前
|
开发框架 物联网 云计算
Qt应用领域分析与实践
Qt应用领域分析与实践
145 0
|
4月前
|
自然语言处理 安全 算法
【Qt 基础 】深入理解Qt:qApp的全面掌握与实践
【Qt 基础 】深入理解Qt:qApp的全面掌握与实践
164 1
|
4月前
|
存储 编译器 C++
【Qt 元对象系统 02】深入探索Qt的元对象编译器:从原理到实践
【Qt 元对象系统 02】深入探索Qt的元对象编译器:从原理到实践
282 0
Qt BarChart实践
按照帮助文档编写
110 0
Qt BarChart实践
Qt Charts实践
Qt Charts的横空出世标志着QWT,QCustomPlot 。。。。。时代的终结,让我们开始使用QtCharts吧
186 0
Qt Charts实践
|
编译器
Qt Creator plugin动手实践(5)分享一个简化版的插件框架,qt-creator-minimal
Qt Creator plugin动手实践(5)分享一个简化版的插件框架,qt-creator-minimal
412 0
Qt Creator plugin动手实践(5)分享一个简化版的插件框架,qt-creator-minimal
Qt Creator plugin动手实践(4)C++ 类ModeManager源码分析
Qt Creator plugin动手实践(4)C++ 类ModeManager源码分析
303 0
Qt Creator plugin动手实践(4)C++ 类ModeManager源码分析
|
IDE 开发工具 C++
Qt Creator plugin动手实践(3)C++ 类ModeManager源码分析
Qt Creator plugin动手实践(3)C++ 类ModeManager源码分析
302 0
Qt Creator plugin动手实践(3)C++ 类ModeManager源码分析