qt-画波形图

这个波形图画的有点复杂,而且核心代码是拷贝的别人的,这里我就简单解析一下吧,
话不多说,上代码。
bxt.cpp

#include 
#include 
#include 
#include 
#include "ui_mainwindow.h"
#include 

using namespace std;


testScene::testScene()
{
    setSceneRect(QRectF(0,0,500,180));

    qsrand(QTime::currentTime().msec());

    mPath.moveTo(0,90);
    for(int i=0; i<500; i=i+5)
    {
        int x = i;
        int y = qrand()%150+20;
//        qDebug()<
        mPath.lineTo(QPointF(x,y));
    }
}

testScene::~testScene()
{

}

void testScene::drawBackground( QPainter *painter, const QRectF &rect )
{

    painter->save();

    painter->setBrush(Qt::white);
    painter->drawRect(rect);

    painter->setPen(Qt::blue);
    const double w = sceneRect().width();
    const double h = sceneRect().height();
    for(int i=0; i100)
    {
        QLineF line(QPointF(0,i),QPointF(w,i));
        painter->drawLine(line);
    }
    painter->restore();
}

void testScene::drawForeground( QPainter *painter, const QRectF &rect )
{

    painter->save();
    painter->setPen(QPen(Qt::black,1));
    painter->drawPath(mPath);

    painter->restore();
}

void testScene::slot_update()
{
    qsrand(QTime::currentTime().msec());

    mPath = QPainterPath();
    mPath.moveTo(0,0);
    for(int i=0; i<800; i=i+5)
    {
        int x = i;
        int y = qrand()%150+20;
        mPath.lineTo(QPointF(x,y));
    }

    double w = sceneRect().width();
    double h = sceneRect().height();
    double step = w/10;

    for(int i=0; i0,step,h);
        //QTest::qSleep(1000);
        qDebug()<<"scene update()"<void testView::slot_update()
{
    //double w = rect().width();
    //double h = rect().height();
    //double step = w/10;

    //for(int i=0; i
    //{
    //  update (i,0,step,h);
    //  //QTest::qSleep(1000);
    //  qDebug()<<"view update()"<
    //}
}

testView::testView( QWidget* parent)
    : QGraphicsView(parent)
{
    centerOn(0,0);

    setCacheMode(QGraphicsView::CacheBackground);
    setRenderHint(QPainter::Antialiasing, true);
    //setRenderHint(QPainter::TextAntialiasing, true);
    setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
}

testView::~testView()
{

}

main.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
#include "filemanager.h"
#include 

#include 
#include 

namespace Ui {
class MainWindow;
}


class testView : public QGraphicsView
{
    Q_OBJECT

public:
    testView(QWidget* parent = NULL);
    ~testView();

private slots:
    void slot_update();
};



class testScene : public QGraphicsScene
{
    Q_OBJECT

public:
    testScene();
    ~testScene();

private slots:
    void slot_update();

protected:
    virtual void drawBackground(QPainter *painter, const QRectF &rect);
    virtual void drawForeground(QPainter *painter, const QRectF &rect);

private:
    QPainterPath mPath;
};
//上面两个类是画图所用的设计,,就是重载了一些函数,,,貌似可以不用重载么,,,,待我看看




class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QStandardItemModel *student_model;
protected:
    void paintEvent ( QPaintEvent * event );

public:
    void initControl(void);
    void initTableView();
    void addTableViewData();

private slots:
    void showboxin();
    void showbxt();
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

类MainWindow是我的界面函数,波形图是嵌套在我的主界面里面的。
所以只需要在mainwindow类里面实现

void paintEvent ( QPaintEvent * event );

就可以了,
然后上面的两个类是用来画图的工具,刚开始我以为不用重载就可以实现画图,但是后来试了一下,确实可以实现,但是问题就是画板没有或者是不好控制,
第一个类其实就是定义画板,第二个类是用来画画的。
第二个可以不继承直接定义一个变量实现,但是第一个必须继承,然后实现一个画板,

bxt.cpp
testScene的构造函数里面第一行是定义了画布大小是500~180,,这个是根据我的界面大小设置的。

qsrand(QTime::currentTime().msec());

这行就是初始化随机函数,因为他的波形图没有数据源,所以随机产生,

mPath.moveTo(0,90);

mpath是一个QPainter变量,moveto是一定到指定的点,
lineto是划线到某个点,
第一个drawBackground函数是设置画图的画刷还有画笔。
第二个drawBackground函数是设置画图的背景色

void testScene::slot_update()

更新画图数据,也是通过随机数的方式
如果我们在自己设计的时候有自己的数据源,就更该这个函数,可以实现动态显示波形图。

qt-画波形图_第1张图片

你可能感兴趣的:(QT)