DiagramDesigner/diagramCavas/source/graphicsItem/electricSvgItemCT.cpp

127 lines
4.2 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/electricSvgItemCT.h"
#include "global.h"
#include <QSvgRenderer>
#include <QPainter>
#include <QStyleOption>
#include <QGraphicsScene>
#include <QGraphicsView>
ElectricSvgItemCT::ElectricSvgItemCT(const QRect &rect, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
/*setHandleIfShow(H_textCaption,false);
setHandleIfShow(H_textCurrent,false);
setHandleIfShow(h_textVoltage,false);
setHandleVisible(false);
setFunctionHandleIfShow(false);
setFunctionHandleEnaable(false);*/
initial();
}
ElectricSvgItemCT::ElectricSvgItemCT(const ElectricSvgItemCT& obj)
:ElectricSvgItem(obj)
{
initial();
_itemType = obj._itemType;
}
ElectricSvgItemCT::~ElectricSvgItemCT()
{
}
ElectricSvgItemCT* ElectricSvgItemCT::clone() const
{
return new ElectricSvgItemCT(*this);
}
void ElectricSvgItemCT::initial()
{
setFlag(QGraphicsItem::ItemIsSelectable, false);
setFlag(QGraphicsItem::ItemIsFocusable, false);
setAcceptedMouseButtons(Qt::NoButton);
}
void ElectricSvgItemCT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
// 计算每个图形的宽度
qreal singleWidth = m_boundingRect.width() / 3.0;
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. 最终绘制
//QRectF rect(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
//painter->drawImage(rect, resultImage);
if(_itemType == 1){
QRectF rect1(m_boundingRect.x(), m_boundingRect.y(), singleWidth, m_boundingRect.height());
painter->drawImage(rect1, resultImage);
// 绘制第二个图形
QRectF rect2(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
painter->drawImage(rect2, resultImage);
// 绘制第三个图形
QRectF rect3(m_boundingRect.x() + 2 * singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
painter->drawImage(rect3, resultImage);
}
else if(_itemType == 0){
QRectF rect(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
painter->drawImage(rect, resultImage);
}
}
else{
if (!m_pRender || !m_pRender->isValid())
return;
// 绘制第一个图形
if(_itemType == 1){
QRectF rect1(m_boundingRect.x(), m_boundingRect.y(), singleWidth, m_boundingRect.height());
m_pRender->render(painter, rect1);
// 绘制第二个图形
QRectF rect2(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
m_pRender->render(painter, rect2);
// 绘制第三个图形
QRectF rect3(m_boundingRect.x() + 2 * singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
m_pRender->render(painter, rect3);
}
else if(_itemType == 0){
QRectF rect(m_boundingRect.x() + singleWidth, m_boundingRect.y(), singleWidth, m_boundingRect.height());
m_pRender->render(painter, rect);
}
}
}