Qt Charts_Audio实践

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

 

上预览图

 

 

工程文件代码

 

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


 

转载于:https://www.cnblogs.com/DreamDog/p/9160043.html

### 回答1: 这是Qt Charts模块中的命名空间声明,用于将类放入命名空间中,避免命名冲突。具体来说,QT_CHARTS_BEGIN_NAMESPACE表示开始一个Qt Charts命名空间,QT_CHARTS_END_NAMESPACE表示结束一个Qt Charts命名空间。在这个命名空间中,class QChart;表示声明了一个名为QChart的类。QChart是一个用于绘制图表的类,它是Qt Charts模块中的一个核心类。使用QChart,我们可以创建各种类型的图表,比如折线图、柱状图、饼状图等等。 ### 回答2: QT_CHARTS_BEGIN_NAMESPACE是QT Charts库中的一个命名空间开始标记,表示接下来定义的类、函数和变量都属于这个命名空间。命名空间用于防止命名冲突,将不同的代码组织在不同的命名空间中,以提高代码的可维护性和可读性。 class QChart;是在QT_CHARTS_BEGIN_NAMESPACE命名空间中声明的一个类QChart。这个类是QT Charts库中的一个核心类,用于创建和管理图表。 QT_CHARTS_END_NAMESPACE是QT Charts库中的一个命名空间结束标记,表示命名空间中定义的类、函数和变量的范围到此结束。 通过使用命名空间,可以避免不同模块中的类、函数和变量之间的命名冲突。同时,将相关的类、函数和变量组织在同一个命名空间中,可以提高代码的可读性和可维护性。 总之,QT_CHARTS_BEGIN_NAMESPACE和QT_CHARTS_END_NAMESPACE是QT Charts库中的命名空间的开始和结束标记,用于定义和组织与图表相关的类、函数和变量。 ### 回答3: 在这段代码中, QT_CHARTS_BEGIN_NAMESPACE是一个宏定义,用于标识Qt Charts命名空间的开始。这意味着在它之后声明的所有类、函数和变量都将属于Qt Charts命名空间。class QChart是在QT_CHARTS_BEGIN_NAMESPACE和QT_CHARTS_END_NAMESPACE之间定义的一个类。QChart类是Qt Charts库中的一个重要类,用于绘制各种类型的图表,例如折线图、散点图、柱状图等。QT_CHARTS_END_NAMESPACE是另一个宏定义,用于标识Qt Charts命名空间的结束。在它之后声明的所有类、函数和变量都将不再属于Qt Charts命名空间,除非另有指定。通过使用这种形式的宏定义,可以更方便地组织和管理多个命名空间,避免命名冲突,并提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值