c++ 实现绘图功能

运行结果


#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值