运行结果
#include "plotter.h"
#include <qtoolbutton.h>
#include "PlotSettings.h"
#include <QIcon>
#include <qstylepainter.h>
#include <qstyleoption.h>
#include <qstyle.h>
#include <qevent.h>
#include <algorithm>
#include <qpolygon.h>
const QColor plotter::s_colorForIds[COLOR_FOR_IDS_SIZE] = {
Qt::red,Qt::green,Qt::blue,Qt::cyan,Qt::magenta,Qt::yellow
};
plotter::plotter(QWidget *parent)
: QWidget(parent){
//告诉调色板用暗分量作为重绘窗口部件的角色
setBackgroundRole(QPalette::Dark);
//子窗口部件从父窗口继承相应的背景色
setAutoFillBackground(true);
//大小的策略
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
//通过单击或者tab输入焦点
setFocusPolicy(Qt::StrongFocus);
//设置橡皮筋窗口不可见
m_rubberBandIsShown = false;
//放大按钮
m_zoomInButton = new QToolButton(this);
m_zoomInButton->setIcon(QIcon("src/in.png"));
m_zoomInButton->adjustSize();
connect(m_zoomInButton, SIGNAL(clicked()), this, SLOT(zoomIn()));
//缩小按钮
m_zoomOutButton = new QToolButton(this);
m_zoomOutButton->setIcon(QIcon("src/out.png"));
m_zoomOutButton->adjustSize();
connect(m_zoomOutButton, SIGNAL(clicked()), this, SLOT(zoomOut()));
setPlotSettings(PlotSettings());//默认设置
}
void plotter::setPlotSettings(const PlotSettings& settings){
//使得堆栈只存放一项
m_zoomStack.clear();
m_zoomStack.push_back(settings);
//当前的plotsetting
m_curZoom = 0u;
//设置按钮隐藏
m_zoomInButton->hide();
m_zoomOutButton->hide();
//刷新映射
refreshPixmap();
}
void plotter::zoomOut(){
//在头部
if (m_curZoom <= 0) return;
//缩小槽的设置
--m_curZoom;
m_zoomOutButton->setEnabled(m_curZoom > 0);
m_zoomInButton->setEnabled(true);
m_zoomInButton->show();
//刷新映射
refreshPixmap();
}
void plotter::zoomIn(){
//如果在末端就不继续
if (m_curZoom >= static_cast<int>(m_zoomStack.size()) - 1) return;
//放大槽的设置
++m_curZoom;
m_zoomInButton->setEnabled(m_curZoom < static_cast<int>(m_zoomStack.size()) - 1);
m_zoomOutButton->setEnabled(true);
m_zoomOutButton->show();
//刷新映射
refreshPixmap();
}
void plotter::setCurveData(const int key, const QPointFVec& data){
//添加或替换新的曲线
m_curvesMap[key] = data;
refreshPixmap();
}
void plotter::clearCurve(const int key){
//删除曲线
QPointFVecMap::iterator it = m_curvesMap.find(key);
//如果没有找到
if (it == m_curvesMap.end()) return;
m_curvesMap.erase(it);
refreshPixmap();
}
void plotter::paintEvent(QPaintEvent* /** event */){
//画笔
QStylePainter painter(this);
//绘制pixmap
painter.drawPixmap(0, 0, m_pixmap);
if (m_rubberBandIsShown){
//获得画板中颜色,以形成反差
// painter.setPen(palette().light().color());
painter.setPen(palette().dark().color());
//大小减去一 以允许有一个一像素的轮廓
painter.drawRect(m_rubberBandRe