92 lines
2.4 KiB
C++
92 lines
2.4 KiB
C++
#include "ShapeWidget.h"
|
|
|
|
#include <QPainter>
|
|
#include <QPainterPath>
|
|
#include <QSvgRenderer>
|
|
#include <QApplication>
|
|
#include <QFileInfoList>
|
|
#include <QDir>
|
|
|
|
|
|
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);
|
|
}
|