#include "QCPSizeHandleManager.h" QCPSizeHandleManager::QCPSizeHandleManager(QCustomPlot *parentPlot) : QCPLayerable(parentPlot) { } QCPSizeHandleManager::~QCPSizeHandleManager() { } void QCPSizeHandleManager::addItem(QCPAbstractItem *item, bool showHandlesLines) { if (!item || mHandles.contains(item)) return; if (item->positions().size() < 2) // 要改变item的大小,最起码要两个位置 return; QList handles; foreach (auto *position, item->positions()) { handles.push_back(addHandleToPosition(position)); } ControlItemData data; data.showHandlesLines = showHandlesLines; data.handles = handles; mHandles.insert(item, data); } void QCPSizeHandleManager::handleItemMove(QCPAbstractItem *item, const QPointF &delta) { if (!item) return; auto positions = item->positions(); foreach (auto *position, positions) position->setPixelPosition(position->pixelPosition() + delta); } void QCPSizeHandleManager::handleItemResize(QCPSizeHandle *sizeHandle, const QPointF &delta) { if (!sizeHandle) return; auto *parentPosition = static_cast(sizeHandle->position->parentAnchor()); if (!parentPosition) return; parentPosition->setPixelPosition(parentPosition->pixelPosition() + delta); } QCPSizeHandle *QCPSizeHandleManager::addHandleToPosition(QCPItemPosition *position) { auto *handle = new QCPSizeHandle(mParentPlot); handle->position->setParentAnchor(position); // 设置QCPSizeHandle的父锚点为position handle->setVisible(false); handle->setLayer(QLatin1String("overlay")); return handle; } void QCPSizeHandleManager::applyDefaultAntialiasingHint(QCPPainter *painter) const { applyAntialiasingHint(painter, mAntialiased, QCP::aeOther); } void QCPSizeHandleManager::draw(QCPPainter *painter) { QMapIterator i(mHandles); while (i.hasNext()) { i.next(); auto data = i.value(); if (!data.showHandlesLines) continue; painter->setPen(data.connectHandlePen); QVector lines; foreach (auto *handle, data.handles) lines.push_back(handle->position->pixelPosition()); painter->drawLines(lines); // painter->drawPolyline(QPolygonF(lines)); } }