如何使用 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);
我想使用 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);