DiagramDesigner/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgIte...

171 lines
4.9 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 "graphicsItem/functionModelItem/electricFunctionModelSvgItem.h"
#include <QPainter>
#include <QStyleOption>
#include <QSvgRenderer>
#include <QDebug>
ElectricFunctionModelSvgItem::ElectricFunctionModelSvgItem(const QRect &rect,QGraphicsItem *parent)
: GraphicsFunctionModelItem(parent),m_pRender(nullptr),m_pCustomRender(nullptr)
{
m_lastBoudingRect = rect;
m_boundingRect = rect;
m_dWidth = rect.width();
m_dHeight = rect.height();
setHandleIfShow(H_textCaption,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);
}
ElectricFunctionModelSvgItem::~ElectricFunctionModelSvgItem()
{
if(m_pRender)
delete m_pRender;
}
QPainterPath ElectricFunctionModelSvgItem::shape()
{
QPainterPath path;
path.addRect(m_boundingRect);
return path;
}
void ElectricFunctionModelSvgItem::updateCoordinate() //当执行了resie和editShape函数后boundingRect发生了变换需要将item的原点(以中心点为原点)校准至boundingRect.center()
{
if (!parentItem())
{
QPointF pt1, pt2, delta;
pt1 = mapToScene(QPointF(0, 0));
pt2 = mapToScene(m_boundingRect.center());
delta = pt1 - pt2;
prepareGeometryChange();
//将boundingRect设置成中心点和原点也是默认变换原点这样三点重合有助于简化计算
m_boundingRect = QRectF(-m_dWidth / 2, -m_dHeight / 2, m_dWidth, m_dHeight);
//setTransformOriginPoint(m_boundingRect.center()); //变换中心默认为item的(0,0)点,所以不执行这句话也没有问题
//更新bouondingRect后重回会显示位置会有变化需要做对应的移动
moveBy(-delta.x(), -delta.y());
updateHandles();
}
m_lastBoudingRect = m_boundingRect;
}
void ElectricFunctionModelSvgItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
if(_curMonitorStateEnable){
painter->setRenderHint(QPainter::Antialiasing);
QSize imageSize = m_boundingRect.size().toSize();
if (imageSize.isEmpty()) return;
// 1. 渲染SVG到图像
QImage sourceImage(imageSize, QImage::Format_ARGB32_Premultiplied);
sourceImage.fill(Qt::transparent);
QPainter sourcePainter(&sourceImage);
sourcePainter.setRenderHint(QPainter::Antialiasing);
m_pCustomRender->render(&sourcePainter, QRectF(0, 0, imageSize.width(), imageSize.height()));
sourcePainter.end();
// 2. 直接使用合成模式改变颜色(更高效)
QImage resultImage(imageSize, QImage::Format_ARGB32_Premultiplied);
resultImage.fill(Qt::transparent);
QPainter resultPainter(&resultImage);
// 先绘制原始SVG保留透明度
resultPainter.drawImage(0, 0, sourceImage);
// 然后对非透明区域应用颜色叠加
resultPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
resultPainter.fillRect(resultImage.rect(), QColor(_curMonitorStateColor));
resultPainter.end();
// 3. 最终绘制
painter->drawImage(m_boundingRect, resultImage);
}
else{
if(m_pRender)
{
m_pRender->render(painter,m_boundingRect);
}
}
painter->setPen(m_pen);
painter->setBrush(m_brush);
if(m_state == S_prepareConnect)
{
painter->setPen(QPen(QColor(255,51,153,180)));
painter->drawLine(m_beginConnectPoint,m_endConnectPoint);
}
if(m_touched)
{
painter->setPen(QPen(QColor(238,58,140,220)));
painter->drawRect(m_boundingRect);
}
if (option->state & QStyle::State_Selected) //是选中状态,绘制选中框
{
renderSelectBackground(painter);
}
}
void ElectricFunctionModelSvgItem::move(const QPointF& point)
{
moveBy(point.x(), point.y());
}
void ElectricFunctionModelSvgItem::loadSvg(QByteArray b)
{
if(m_pRender == nullptr){
m_pRender = new QSvgRenderer(b);
}
else{
m_pRender->load(b);
}
_tempSvg = b;
update();
}
void ElectricFunctionModelSvgItem::updateMapSvg(QMap<QString,QByteArray> map,QString sIndex)
{
if(sIndex.isEmpty())
m_mapSvg = map;
else{
m_mapSvg[sIndex] = map[sIndex];
}
if(!m_mapSvg.isEmpty())
loadSvg(m_mapSvg.first());
}
void ElectricFunctionModelSvgItem::editShape(int nHandle,const QPointF& ptMouse)
{
prepareGeometryChange();
updateHandles();
}
void ElectricFunctionModelSvgItem::updateCurState(MonitorItemState e)
{
GraphicsProjectModelItem::updateCurState(e);
if(m_pCustomRender == nullptr){
m_pCustomRender = new QSvgRenderer(_curMonitorStateSvg);
}
else{
m_pCustomRender->load(_curMonitorStateSvg);
}
}
QFileInfo ElectricFunctionModelSvgItem::getImage_1() const
{
return QFileInfo(m_bgImagePath);
}
void ElectricFunctionModelSvgItem::setImage_1(QFileInfo info)
{
m_bgImagePath = info.absoluteFilePath();
}