logplus/logPlus/QCPSizeHandleManager.cpp
jiayulong f78bed60d3 1.优化蝌蚪图,支持倾角类型的刻度。
2.测试自定义item,支持拖拉改变位置,大小
2025-12-01 17:13:17 +08:00

90 lines
2.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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<QCPSizeHandle *> 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<QCPItemPosition *>(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<QCPAbstractItem *, ControlItemData> i(mHandles);
while (i.hasNext()) {
i.next();
auto data = i.value();
if (!data.showHandlesLines)
continue;
painter->setPen(data.connectHandlePen);
QVector<QPointF> lines;
foreach (auto *handle, data.handles)
lines.push_back(handle->position->pixelPosition());
painter->drawLines(lines);
// painter->drawPolyline(QPolygonF(lines));
}
}