Qchart实现左键缩放,左键框选放大,滚轮放大缩小,右键拖动,右键复位,右键清空数据,显示当前X,Y轴值
在之前我们实现了QCustomplot曲线的显示设置,功能基本相同,也是左键缩放,左键框选放大,滚轮放大缩小,右键复位,右键清空数据,然后由于QCustomplot虽然兼容QT4,QT5但是样式过于一般,包括标题栏都需要自己去设置。所以按照之前的功能实现Qchart。
实现效果
右键菜单
右键长按拖动
左键框选放大,滚轮放大缩小
实现思想
首先也是先继承QchartView做自定义的通用控件,代码尽量通用,可以在以后的工程直接导入使用。
自定义控件使用,直接提升即可。不会的可以自行百度噢。
左键框选缩放,右键拖动
首先,我们需要去判断当前是否为左键
b_isLeftPress = true; 这个是标识,后面会用到
QGraphicsRectItem是一个图型选择框,创建在chart里防止内存泄漏
pt_lastPoint是我们最后鼠标释放是的点,在鼠标释放事件里会用到
b_isRightPress = true;右键拖动标志
if (event->button() == Qt::LeftButton)
{
pt_lastPoint = event->pos();
b_isLeftPress = true;
gr_RectItem = new QGraphicsRectItem(this->chart());
gr_RectItem->setZValue(10);
gr_RectItem->setRect(QRect(pt_lastPoint, pt_lastPoint));
gr_RectItem->show();
QPen pen = gr_RectItem->pen();
pen.setColor(QColor(0, 120, 215));
pen.setWidth(1);
// pen.setStyle(Qt::DashLine);
gr_RectItem->setPen(pen);
gr_RectItem->setBrush(QBrush(QColor(0, 120, 215, 100)));
}
else if (event->button() == Qt::RightButton)
{
setCursor(QCursor(Qt::SizeAllCursor));
pt_lastPoint = event->pos();
pt_currentPoint = cursor().pos();
b_isRightPress = true;
}
滚轮放大缩小
chart有自带的缩放的函数zoomIn 和 zoomout 这里代码有些冗余,非小白可以直接重新实现这里面的缩放。自己实现可能15行代码就够了。这段代码写的有些垃圾。
// 鼠标滚轮事件
void ChartView::wheelEvent(QWheelEvent *event)
{
if (chart()->series().size())
{
const QPoint curPos = event->pos();
QPointF curVal = this->chart()->mapToValue(QPointF(curPos));
const double factor = 1.5;//缩放比例
if (b_ctrlPress)
{//Y轴
Zoom_Y(curVal, factor, event->delta());
}
else if (b_altPress)
{//X轴
Zoom_X(curVal, factor, event->delta());
}
else
{
Zoom_Y(curVal, factor, event->delta());
Zoom_X(curVal, factor, event->delta());
}
QChartView::wheelEvent(event);
}
}
// 放大X轴
void ChartView::Zoom_X(QPointF curVal, double factor, int delta)
{
QValueAxis *axisX = dynamic_cast<QValueAxis*>(this->chart()->axisX());
const double xMin = axisX->min();
const double xMax = axisX->max();
const double xCentral = curVal.x();
double leftOffset;
double rightOffset;
if (delta > 0)
{//放大
leftOffset = 1.0 / factor * (xCentral - xMin);
rightOffset = 1.0 / factor * (xMax - xCentral);
}
else
{//缩小
leftOffset = 1.0 * factor * (xCentral - xMin);
rightOffset = 1.0 * factor * (xMax - xCentral);
}
this->chart()->axisX()->setRange(xCentral - leftOffset, xCentral + rightOffset);
}
// 放大Y轴
void ChartView::Zoom_Y(QPointF curVal, double factor, int delta)
{
QValueAxis *axisY = dynamic_cast<QValueAxis*>(this->chart()->axisY());
const double yMin = axisY->min();
const double yMax = axisY->max();
const double yCentral = curVal.y();
double bottomOffset;
double topOffset;
if (delta > 0)
{//放大
bottomOffset = 1.0 / factor * (yCentral - yMin);
topOffset = 1.0 / factor * (yMax - yCentral);
}
else
{//缩小
bottomOffset = 1.0 * factor * (yCentral - yMin);
topOffset = 1.0 * factor * (yMax - yCentral);
}
this->chart()->axisY()->setRange(yCentral - bottomOffset, yCentral + topOffset);
}
源代码
有需要可以直接留言!免费发