#include "graphicsItem/electricSvgItemCT.h" #include "global.h" #include #include #include #include #include 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); } } }