合理地设置QPainter的QPen和QBrush就能直接绘制出内部填充的多边形,内部填充不需要再另作操作。
正常设置QPen和QBrush绘制多边形
添加多余的region:
QPainterPath path;
double Pi = 3.1415926;
switch (m_type)
{
case 2: // 方形
{
double point_in_x_1 = m_in_r * cos(4 * Pi / 180);
double point_in_y_1 = m_in_r * sin(4 * Pi /180);
QPointF point1 = convert_coord(point_in_x_1, point_in_y_1);
qDebug() << point1;
double point_out_x_1 = point_in_x_1 + (m_out_r - m_in_r);
double point_out_y_1 = point_in_y_1;
QPointF point2 = convert_coord(point_out_x_1, point_out_y_1);
qDebug() << point2;
double point_out_x_2 = point_out_x_1;
double point_out_y_2 = -point_out_y_1;
QPointF point3 = convert_coord(point_out_x_2, point_out_y_2);
qDebug() << point3;
double point_in_x_2 = point_in_x_1;
double point_in_y_2 = -point_in_y_1;
QPointF point4 = convert_coord(point_in_x_2, point_in_y_2);
qDebug() << point4;
QPolygon polygon;
polygon << QPoint(int(point1.x() + (pen_width / 2)), int(point1.y() - (pen_width / 2)))
<< QPoint(int(point2.x() - (pen_width / 2)), int(point2.y() - (pen_width / 2)))
<< QPoint(int(point3.x() - (pen_width / 2)), int(point3.y() - (pen_width / 2)))
<< QPoint(int(point4.x() + (pen_width / 2)), int(point4.y() - (pen_width / 2)));
path.addPolygon(polygon);
path.closeSubpath();
// QRegion region(polygon, Qt::WindingFill); //添加region
// path.addRegion(region);
break;
}
case 3: // 五边形
{
double point_x_1 = m_out_r;
double point_y_1 = 0;
QPointF point1 = convert_coord(point_x_1, point_y_1);
double circle_x_mid = (m_out_r + m_in_r) / 2;
double circle_y_mid = 0;
double circle_r = (m_out_r - m_in_r) * 0.6;
double point_x_2_scircle = circle_r * cos(72 * Pi / 180);
double point_y_2_scircle = circle_r * sin(72 * Pi / 180);
QPointF point2 = convert_coord(point_x_2_scircle + circle_x_mid, point_y_2_scircle + circle_y_mid);
double point_x_3_scircle = circle_r * cos(144 * Pi / 180);
double point_y_3_scircle = circle_r * sin(144 * Pi / 180);
QPointF point3 = convert_coord(point_x_3_scircle + circle_x_mid, point_y_3_scircle + circle_y_mid);
double point_x_4_scircle = point_x_3_scircle;
double point_y_4_scircle = -point_y_3_scircle;
QPointF point4 = convert_coord(point_x_4_scircle + circle_x_mid, point_y_4_scircle + circle_y_mid);
double point_x_5_scircle = point_x_2_scircle;
double point_y_5_scircle = -point_y_2_scircle;
QPointF point5 = convert_coord(point_x_5_scircle + circle_x_mid, point_y_5_scircle + circle_y_mid);
QPolygon polygon;
polygon << QPoint(int(point1.x() + (pen_width / 2)), int(point1.y() - (pen_width / 2)))
<< QPoint(int(point2.x() - (pen_width / 2)), int(point2.y() - (pen_width / 2)))
<< QPoint(int(point3.x() - (pen_width / 2)), int(point3.y() - (pen_width / 2)))
<< QPoint(int(point4.x() - (pen_width / 2)), int(point4.y() - (pen_width / 2)))
<< QPoint(int(point5.x() - (pen_width / 2)), int(point5.y() - (pen_width / 2)));
path.addPolygon(polygon);
path.closeSubpath();
// QRegion region(polygon, Qt::WindingFill);
// path.addRegion(region);
break;
}
case 4: // 六边形
{
double circle_x_mid = (m_out_r + m_in_r) / 2;
double circle_y_mid = 0;
double circle_r = (m_out_r - m_in_r) * 0.575;
double point_x_1_scircle = circle_r;
double point_y_1_scircle = 0;
QPointF point1 = convert_coord(point_x_1_scircle + circle_x_mid, point_y_1_scircle + circle_y_mid);
double point_x_2_scircle = circle_r * cos(60 * Pi / 180);
double point_y_2_scircle = circle_r * sin(60 * Pi / 180);
QPointF point2 = convert_coord(point_x_2_scircle + circle_x_mid, point_y_2_scircle + circle_y_mid);
double point_x_3_scircle = circle_r * cos(120 * Pi / 180);
double point_y_3_scircle = circle_r * sin(120 * Pi / 180);
QPointF point3 = convert_coord(point_x_3_scircle + circle_x_mid, point_y_3_scircle + circle_y_mid);
double point_x_4_scircle = -circle_r;
double point_y_4_scircle = 0;
QPointF point4 = convert_coord(point_x_4_scircle + circle_x_mid, point_y_4_scircle + circle_y_mid);
double point_x_5_scircle = point_x_3_scircle;
double point_y_5_scircle = -point_y_3_scircle;
QPointF point5 = convert_coord(point_x_5_scircle + circle_x_mid, point_y_5_scircle + circle_y_mid);
double point_x_6_scircle = point_x_2_scircle;
double point_y_6_scircle = -point_y_2_scircle;
QPointF point6 = convert_coord(point_x_6_scircle + circle_x_mid, point_y_6_scircle + circle_y_mid);
QPolygon polygon;
polygon << QPoint(int(point1.x() + (pen_width / 2)), int(point1.y() - (pen_width / 2)))
<< QPoint(int(point2.x() - (pen_width / 2)), int(point2.y() - (pen_width / 2)))
<< QPoint(int(point3.x() - (pen_width / 2)), int(point3.y() - (pen_width / 2)))
<< QPoint(int(point4.x() - (pen_width / 2)), int(point4.y() - (pen_width / 2)))
<< QPoint(int(point5.x() - (pen_width / 2)), int(point5.y() - (pen_width / 2)))
<< QPoint(int(point6.x() - (pen_width / 2)), int(point6.y() - (pen_width / 2)));
// QRegion region(polygon, Qt::WindingFill);
// path.addRegion(region);
path.addPolygon(polygon);
path.closeSubpath();
break;
}
default:
{
qDebug() << "samp_cup::re_cup_path no such type";
break;
}
}
QPainter w_painter(this);
w_painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
w_painter.save();
w_painter.setPen(QPen(status_color.at(m_status), pen_width));
QColor bgcolor;
bgcolor = status_color.at(m_status);
bgcolor.setAlpha(180);
w_painter.setBrush(QBrush(bgcolor, Qt::SolidPattern));
QRect parent_w = this->parentWidget()->geometry();
w_painter.translate((parent_w.width() - tray_r), (parent_w.height() - tray_r));
w_painter.rotate(m_angle);
w_painter.translate(-(parent_w.width() - tray_r), -(parent_w.height() - tray_r));
w_painter.drawPath(re_cup_path());