//绘制示波器的实时曲线是通过QPainter的drawLine实现的。 QPainter的类进行低层次的画在控件和其他绘图设备。QPainter提供高度优化的功能来完成大多数绘图 GUI 程序所需的工作。它可以绘制从简单线条到复杂形状(如馅饼和和弦)的所有内容。它还可以绘制对齐的文本和像素图。通常,它在“自然”坐标系中绘制,但它也可以进行视图和世界变换。QPainter可以对任何继承QPaintDevice类的对象进行操作。QPainter的常见用途是在小部件的绘制事件中:构造和自定义(例如设置笔或画笔)画家。然后画。记得在绘制后销毁QPainter对象
资料见网址
以下是源码
#include "drawer.h"
#include #include #include #include #include
Drawer::Drawer(QWidget *parent) : QWidget(parent) { myTimerId=0; xpos=0; pixel=-1; //负数证明向左移动 displayDatacharge=0; displayDatalypos=0;
} void Drawer::openDraw() { Close=false; myTimerId=startTimer(5);//第一个时钟,返回1 //使用时钟来刷新示波器的界面
} void Drawer::closeDraw() { Close=true; killTimer(myTimerId); update();
} void Drawer::drawGrid(QPainter &painter)//绘制网格 { painter.setPen(Qt::green); //定时绘制竖直方向的直线 //if(this->xpos==0||xpos%2==0) // painter.drawLine(this->width()-0.5,-this->height(),this->width()-0.5,0); xpos++;
// //不再绘制竖直和水平的线 而只是绘制y = 0 // painter.drawLine(0,-150,this->width(),-150); //绘制水平方向的直线 for(int u=0;uheight();u++) { if(u%50==0) { painter.drawLine(0,-u,this->width(),-u); } }
//绘制竖直方向的直线 for(int t=0;t<this->width();t++) { if(t%50==0) { painter.drawLine(t,0,t,-this->height()); } } 复制代码
} void Drawer::drawCurves(QPainter &painter)//绘制实时曲线 { painter.setPen(Qt::black); displayDatafypos=displayDatacharge; displayDatacharge=displayDatalypos; painter.drawLine(this->width()+this->pixel,-displayDatafypos,this->width(),-displayDatalypos); } void Drawer::paintEvent(QPaintEvent *) { QPainter paint(this); paint.setBrush(Qt::white);//设置绘制背景的笔的颜色 paint.setViewport(0,0,this->width(),this->height());//设置视口,物理坐标 paint.setWindow(QRect(0,-this->height(),this->width(),this->height()));//设置窗口,逻辑坐标 paint.drawRect(0,-this->height(),this->width(),this->height());//绘制背景 if(Close!=true) { drawGrid(paint); drawCurves(paint); } } void Drawer::timerEvent(QTimerEvent *event) //当时钟周期定义是启动 { int testpos ; if(event->timerId()==myTimerId){ scroll(this->pixel,0); testpos = *pPosition; testpos = testpos/8388608/2; testpos = testpos +150; displayDatalypos=testpos; //数据的入口; // displayDatalypos=rand()%150; //数据的入口;
} else{ QWidget::timerEvent(event);} 复制代码
}