本來是想寫一篇上位機通過序列槽接收資料并進行簡單實時動态畫圖的,但是網上關于Qt序列槽接收資料的部落格已經非常多了,且也會導緻内容太多,顯得複雜,如果需要序列槽收發資料例程,網上随便百度就能收到了,也可以下載下傳我寫的北鬥/GPS雙模定位上位機,這裡主要介紹一下收到資料後的畫圖實作。
使用Qt繪制圖形,首先需要了解Qt的視窗與視口的概念,了解Qt的坐标變換,然後學會掌握Qpainter這個類的使用就能實作基本的繪圖功能了。下面一個實時繪制曲線圖形的例子(坐标用應該直接使用一個Qpoint模闆的清單表示比較好)。這裡,實時資料隻是由使用creatData函數産生,在實際工程中将資料改為讀取實時資料即可。
頭檔案
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
#include <QList>
class Widget : public QWidget
{
Q_OBJECT
protected:
void paintEvent(QPaintEvent *);
public:
int m_count;
float x;
QTimer* m_Timer;
QList<float> xList;
QList<float> yList;
Widget(QWidget *parent = 0);
~Widget();
public slots:
void creatData();
};
#endif // WIDGET_H
源檔案
#include "Widget.h"
#include <QPainter>
#include <QPointF>
#include <QPen>
#include <qmath.h>
Widget::Widget(QWidget *parent) : QWidget(parent)
{
x = -10;
m_count = 0;
m_Timer = new QTimer(this);
m_Timer->start(10);
connect(m_Timer,SIGNAL(timeout()),this,SLOT(creatData()));
}
void Widget::creatData()
{
x += 0.2;
m_count += 1;
if(m_count%2)
{
xList.append(x);
yList.append(qSin(x));
}
else
{
xList.append(x);
yList.append(qSin(x));
update();
}
if(m_count == 100)
{
xList.clear();
yList.clear();
m_count = 0;
x = -10;
}
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen;
pen.setColor(Qt::green);
pen.setStyle(Qt::SolidLine);
pen.setWidthF(0.05);
painter.setPen(pen);
painter.setViewport(50, 50, width()-100, height()-100);
painter.setWindow(-10, 2, 20, -4); // (-10, 2) (10, -2)
painter.fillRect(-10, 2, 20, -4, Qt::white);
painter.drawLine(QPointF(-10, 0), QPointF(10, 0)); // x
painter.drawLine(QPointF(0, 2), QPointF(0, -2)); // y
for(int i = 0; i < yList.count(); i++)
{
if(i == 0)
painter.drawPoint(QPointF(xList[i], yList[i]));
else
painter.drawLine(QPointF(xList[i-1], yList[i-1]), QPointF(xList[i], yList[i]));
}
}
Widget::~Widget()
{
}
主函數
#include <QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}