首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QPainter创建一侧圆形和另一侧平面矩形?

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

Stack Overflow用户
提问于 2018-06-28 13:08:16
回答 2查看 1.3K关注 0票数 1

我想用QPainter实现这样的目标

我试着在QPainter中并排使用两个圆角矩形,但无法实现上面的图像。

代码语言:javascript
复制
    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试过这个

代码语言:javascript
复制
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);  

得到了这个:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-28 13:40:39

在这方面,最好的Qt必须是单独的x和y四舍五入半径。所以没有什么能帮到你的。

得到这个几何学的方法似乎是使用QPainterPath将形状由几个子组件组成,在你的例子中,半径是一个弧形,其余的是3条线。

你应该能够翻译和镜像画家画另一面。因此,你填充和轮廓左侧,然后翻转画家和轮廓右侧。

另外,如果您正在绘制类似于“进度条”之类的内容,则还有另一种操作方法。您将绘制一个规则的圆形矩形,并将其用作掩码,然后您可以通过绘制一个常规矩形来填充所需的数量,该矩形将被掩码剪裁成所需的形状。

好的,看起来您需要一些额外的帮助,下面是一些可以修改的工作代码:

代码语言:javascript
复制
    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);
票数 3
EN

Stack Overflow用户

发布于 2022-06-21 05:17:46

使用QPainter.setClipPath可以获得类似的结果。

代码语言:javascript
复制
    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)

如果还想获得黑色边框,则添加

代码语言:javascript
复制
    painter.setPen(Qt.black)
    painter.setBrush(Qt.NoBrush)
    painter.drawRoundedRect(QRectF(self.rect()), border_radius, border_radius)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51083745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档