82 lines
2.2 KiB
C++
82 lines
2.2 KiB
C++
#include "graphicsItem/electricSvgItemPT.h"
|
||
#include "global.h"
|
||
|
||
#include <QSvgRenderer>
|
||
#include <QPainter>
|
||
#include <QStyleOption>
|
||
#include <QGraphicsScene>
|
||
#include <QGraphicsView>
|
||
|
||
ElectricSvgItemPT::ElectricSvgItemPT(const QRect &rect, QGraphicsItem *parent)
|
||
: ElectricSvgItem(rect,parent)
|
||
{
|
||
initial();
|
||
}
|
||
|
||
ElectricSvgItemPT::ElectricSvgItemPT(const ElectricSvgItemPT& obj)
|
||
: ElectricSvgItem(obj)
|
||
{
|
||
initial();
|
||
_itemType = obj._itemType;
|
||
}
|
||
|
||
ElectricSvgItemPT::~ElectricSvgItemPT()
|
||
{
|
||
|
||
}
|
||
|
||
ElectricSvgItemPT* ElectricSvgItemPT::clone() const
|
||
{
|
||
return new ElectricSvgItemPT(*this);
|
||
}
|
||
|
||
void ElectricSvgItemPT::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->isValid())
|
||
return;
|
||
m_pRender->render(painter, m_boundingRect);
|
||
}
|
||
}
|
||
|
||
void ElectricSvgItemPT::initial()
|
||
{
|
||
setFlag(QGraphicsItem::ItemIsSelectable, false);
|
||
setFlag(QGraphicsItem::ItemIsFocusable, false);
|
||
setAcceptedMouseButtons(Qt::NoButton);
|
||
}
|
||
|