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

上预览图

工程文件代码

#-------------------------------------------------
#
# 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;
}

最新文章

  1. 您真的理解了SQLSERVER的日志链了吗?
  2. JS原生ajax与Jquery插件ajax深入学习
  3. AlloyRenderingEngine入门
  4. 关于npm
  5. Sql server 备份还原后出现&ldquo;受限制用户&rdquo;问题
  6. springmvc之定时器
  7. Spring 4 官方文档学习(十二)View技术
  8. [PHP] PHP请求Socket接口测试
  9. Batman+joker乱谈
  10. mysql,多对多的hibernate操作对应的jdbc操作
  11. linux shell 切换到ROOT用户
  12. jQuery学习笔记(一)——基础选择器、过滤选择器、表单选择器
  13. 知识点2-5:了解Razor语法
  14. Hadoop完全分布式搭建过程中遇到的问题小结
  15. UIView的生命周期和layout方法总结
  16. jvm系列 (五) ---类加载机制
  17. Devstack 安装OpenStack Pike版本(单机环境)
  18. iOS逆向工程概述(转)
  19. [Swift]LeetCode641. 设计循环双端队列 | Design Circular Deque
  20. PS(光影魔术手)

热门文章

  1. 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 题解 pb_ds
  2. [luoguP3627][APIO2009]抢掠计划
  3. struts2 实现文件下载方法汇总
  4. C#基础 一(方法详解)
  5. js标准对象——Date
  6. Es6的那些事
  7. Centos6.9 安装Oracle11gR2
  8. python使用sqlalchemy连接mysql数据库
  9. iOS之一些实用的Demo
  10. Java基础题:集合、String、性能、线程