culturered_client/ProjectorDisplay/ShapeWidget.cpp

92 lines
2.4 KiB
C++
Raw Permalink Normal View History

2024-09-07 03:34:44 +00:00
#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);
}