效果图
思路
使用mouseMoveEvent移动事件来判断鼠标是否在图层中。圆环的坐标路径使用QPainterPath保存,使用QPainterPath的contains方法判断鼠标位置是否在图层之内。
使用两次绘图,外层绘制饼图使用QPainter.drawPie,内层使用QPainter.drawEllipse绘制圆。
透明窗体使用鼠标移动事件完成
#include <QtWidgets>
#include <QPair>
#include <vector>
#include <QPoint>
#include <QPainterPath>
#include <QDebug>
const size_t LABEL = 0;
const size_t PERCENT = 1;
const size_t COLOR = 2;
const size_t PATH = 3;
const size_t HOVER = 4;
const int SHADOW_ALPHA = 128;
const int FULL_ANGLE = 360;
const int ANGLE_UNIT = 16;
class PieChart : public QWidget{
public:
PieChart(QWidget *parent = nullptr) : QWidget(parent) {
setObjectName("PieChart");
QString styleSheet = "QWidget#PieChart{background-color: #ffffff;}";
this->setStyleSheet(styleSheet);
this->setAttribute(Qt::WA_StyledBackground, true);
this->setMouseTracking(true);
}
protected:
void paintEvent(QPaintEvent *event) override {
Q_UNUSED(event); //用于标记一个变量在代码中没有被使用,避免编译器产生未使用变量的警告
QPainter