127 lines
4.2 KiB
C++
127 lines
4.2 KiB
C++
#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);
|
||
}
|
||
}
|
||
}
|
||
|
||
|