#include "ShapeWidget.h" #include #include #include #include #include #include ShapeWidget::ShapeWidget(QWidget* parent /*= nullptr*/) : QWidget(parent) { SetMaskCode(-1, 0); QString svgPath = QString("%1/ProjectDisplay/svg").arg(QApplication::applicationDirPath()); QDir dir(svgPath); QFileInfoList subFileList = dir.entryInfoList(QDir::Files | QDir::CaseSensitive); for (int i = 0; i < subFileList.size(); i++) { QString suffix = subFileList[i].suffix(); if (suffix.compare("svg") == 0) { ++m_shapeCodeCount; } } } void ShapeWidget::Rotate(int angle) { m_rotate += angle; if (m_rotate >= 360) { m_rotate = m_rotate - 360; } else if (m_rotate <= 0) { m_rotate = m_rotate + 360; } resize(width() + 1, height() + 1); update(); resize(width() - 1, height() - 1); } void ShapeWidget::Shape(int shape) { m_shapeCode += shape; if (m_shapeCode >= m_shapeCodeCount) { m_shapeCode = 0; } else if (m_shapeCode < 0) { m_shapeCode = m_shapeCodeCount - 1; } resize(width() + 1, height() + 1); update(); resize(width() - 1, height() - 1); } void ShapeWidget::paintEvent(QPaintEvent* event) { return; QWidget::paintEvent(event); if (-1 == m_shapeCode) { return; } int radius = qMax(width(), height()); QPointF center(width() / 2, height() / 2); QRadialGradient gradient(center, radius); gradient.setColorAt(0, Qt::white); gradient.setColorAt(1, Qt::black); QPainter p(this); p.setBrush(gradient); p.drawEllipse(0, 0, radius, radius); } void ShapeWidget::resizeEvent(QResizeEvent* event) { QSvgRenderer render; const QString svgPath = QString("%1/ProjectDisplay/svg/%2.svg").arg(QApplication::applicationDirPath()).arg(m_shapeCode); render.load(svgPath); QSize size = render.defaultSize(); QPixmap pix(width(), height()); // 可以在这儿直接缩放处理 pix.fill(Qt::transparent); // 像素清空 QPainter painter(&pix); painter.setRenderHints(QPainter::Antialiasing); painter.translate(width() / 2.0f, height() / 2.0f); painter.rotate(m_rotate); painter.translate(-width() / 2.0f, -height() / 2.0f); render.render(&painter); setMask(pix.mask()); QWidget::resizeEvent(event); }