如何使用 QPainter 创建一侧圆角和另一侧扁平矩形?

How to create one side rounded and other side flat rectangle using QPainter?

我想使用 QPainter

实现类似的效果

我尝试在 QPainter 中并排使用 2 个圆角矩形,但无法获得上图。

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QRectF leftRect= QRectF(0, 0, 300, 150);
    QRectF rightRect= QRectF(300, 0, 300, 150);
    painter.fillRect(leftRect, QColor("black");
    painter.drawRoundedRect(leftRect,15,35);
    painter.setPen(QPen("white"));
    painter.setPen(QPen("black"));
    painter.fillRect(rightRect, QColor("white");
    painter.drawRoundedRect(rightRect,15,35);    

这是我尝试得到的

我用 QPainterPath 试过了

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QRectF leftRect= QRectF(0, 0, 300, 150);
QRectF rightRect= QRectF(300, 0, 300, 150);
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRoundedRect(leftRect, 15, 35);
QPen pen(Qt::white, 1);
painter.setPen(pen);
painter.fillPath(path, Qt::black);
painter.drawPath(path);

QPainterPath path2;
path2.setFillRule(Qt::WindingFill);
QPen pen1(Qt::black, 1);
painter.setPen(pen1);
path2.addRoundedRect(rightRect, 15, 35);

painter.fillPath(path2, Qt::white);
painter.drawPath(path2);  

得到这个:

Qt 在这方面必须提供的最好的方法是单独的 x 和 y 圆角半径。所以没有什么可以开箱即用。

似乎获得该几何形状的方法是使用 QPainterPath 由几个子组件组成形状,在您的情况下,半径为圆弧,其余部分为 3 条线。

你应该可以平移镜像绘制另一面。所以你填充并勾勒出左侧,然后翻转画家并勾勒出右侧。

此外,如果您要绘制进度条之类的东西,还有另一种方法。您将绘制一个规则的圆角矩形并将其用作蒙版,然后您可以通过绘制一个规则的矩形来填充您想要的量,该矩形将被蒙版剪裁成所需的形状。

好的,看来您需要一些额外的帮助,这里有一些您可以调整的工作代码:

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QPainterPath path;

    // compose the "half"
    path.moveTo(20, 0);
    path.lineTo(100, 0);
    path.lineTo(100, 40);
    path.lineTo(20, 40);
    path.arcTo(0, 0, 40, 40, -90, -180);

    // draw black half
    painter.setBrush(Qt::black);
    painter.setPen(QPen(Qt::black, 1));
    painter.drawPath(path);

    // mirror and reposition the painter
    QTransform mirror(-1, 0, 0, 0, 1, 0, 0, 0, 1);
    painter.setTransform(mirror);
    painter.translate(-200, 0);

    // draw white half
    painter.setBrush(Qt::white);
    painter.drawPath(path);