我想用QPainter实现这样的目标

我试着在QPainter中并排使用两个圆角矩形,但无法实现上面的图像。
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); 得到了这个:

发布于 2018-06-28 13:40:39
在这方面,最好的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);发布于 2022-06-21 05:17:46
使用QPainter.setClipPath可以获得类似的结果。

percent = 30
border_radius = 10
bar_color = Qt.gray
bar_progress_color = Qt.black
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
path = QPainterPath()
path.addRoundedRect(QRectF(self.rect()), border_radius, border_radius)
painter.setClipPath(path)
painter.setPen(Qt.NoPen)
painter.setBrush(QColor(bar_color))
painter.drawRect(self.rect())
if percent > 0:
painter.setBrush(bar_progress_color)
percent = percent / 100
percent_rect = QRect(0, 0, self.width() * percent, self.height())
painter.drawRect(percent_rect)如果还想获得黑色边框,则添加
painter.setPen(Qt.black)
painter.setBrush(Qt.NoBrush)
painter.drawRoundedRect(QRectF(self.rect()), border_radius, border_radius)https://stackoverflow.com/questions/51083745
复制相似问题