8

我正在开发一个应用程序,我需要使用 Painter 为像素图填充颜色。Pixmap 是具有(底边)2 个圆角的矩形类型。前 2 个角是平的/正常的。

我尝试使用 Qt 的 drawRoundedRect() API,但它使矩形的所有角都变圆了。我需要绘制只有 2 个圆角和其他两个平角的矩形。

如果有人遇到这种情况,请建议我解决方案。

谢谢

4

5 回答 5

19

您可以为此使用 QPainterPath :

    QPainterPath path;
    path.setFillRule( Qt::WindingFill );
    path.addRoundedRect( QRect(50,50, 200, 100), 20, 20 );
    path.addRect( QRect( 200, 50, 50, 50 ) ); // Top right corner not rounded
    path.addRect( QRect( 50, 100, 50, 50 ) ); // Bottom left corner not rounded
    painter.drawPath( path.simplified() ); // Only Top left & bottom right corner rounded
于 2013-03-08T08:44:57.707 回答
4

您可以使用样式表(在运行时或加载文件 qss)。你可以很容易地做到这一点:

QString str = "bottom-right-radius: 10px; top-right-radius: 0px....";
box->setStylesheet(str);

我想该框是 QLabel 内的像素图( label->setPixmap(...) )

或者

将对象名称设置为某物(标签),然后使用

QLabel#name { bottom-right-radius: 10px ... }

在您加载的样式表中。

看看这个网站。它有帮助: http ://border-radius.com/

于 2013-03-08T08:51:37.863 回答
0

您也可以使用arcTo()创建圆角。

展示:

在此处输入图像描述

代码:

// Position of shape
qreal x = 100.0;
qreal y = 100.0;
// Size of shape
qreal width = 300.0;
qreal height = 200.0;
// Radius of corners
qreal corner_radius = 30.0;

QPainterPath path;
path.moveTo(x + corner_radius, y);
path.arcTo(x, y, 2 * corner_radius, 2 * corner_radius, 90.0, 90.0);
path.lineTo(x, y + (height - 2 * corner_radius));
path.arcTo(x, y + (height - 2 * corner_radius), 2 * corner_radius, 2 * corner_radius, 180.0, 90.0);
path.lineTo(x + (width - 2 * corner_radius), y + height);
path.lineTo(x + (width - 2 * corner_radius), y);
path.lineTo(x + corner_radius, y);

painter.drawPath(path);
于 2022-02-14T11:17:42.860 回答
0

您可以分别绘制多边形和饼图以创建具有 2 个圆角的矩形 在此处输入图像描述

代码:

// Position of shape
qreal x = 100;
qreal y = 100;
// Radius of corners
qreal border_radius = 30;
// Size of shape
qreal width = 300;
qreal height = 200;

QPolygonF myPolygon;
myPolygon << QPointF(x, y+border_radius) << QPointF(x+border_radius, y+border_radius)
          << QPointF(x+border_radius, y) << QPointF(x+width, y)
          << QPointF(x+width, y+height) << QPointF(x+border_radius, y+height)
          << QPointF(x+border_radius, y+height-border_radius)
          << QPointF(x, y+height-border_radius) << QPointF(x, y+border_radius);

QPainterPath myPath;
myPath.addPolygon(myPolygon);

QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
QBrush myBrush(QColor(0, 0, 0), Qt::SolidPattern);
painter.setBrush(myBrush);

// Draw base polygon
painter.drawPath(myPath);
// Add rounded corners
painter.drawPie(x, y, 2*border_radius, 2*border_radius, 90*16, 90*16);
painter.drawPie(x, y+height-2*border_radius, 2*border_radius, 2*border_radius, 180*16, 90*16);

它看起来怎样:

在此处输入图像描述

主多边形:

QPolygonF myPolygon;
myPolygon << QPointF(x, y+border_radius) << QPointF(x+border_radius, y+border_radius)
          << QPointF(x+border_radius, y) << QPointF(x+width, y)
          << QPointF(x+width, y+height) << QPointF(x+border_radius, y+height)
          << QPointF(x+border_radius, y+height-border_radius)
          << QPointF(x, y+height-border_radius) << QPointF(x, y+border_radius);

QPainterPath myPath;
myPath.addPolygon(myPolygon);

// Draw base polygon
painter.drawPath(myPath);

在此处输入图像描述

角落:

// Add rounded corners
painter.drawPie(x, y, 2*border_radius, 2*border_radius, 90*16, 90*16);
painter.drawPie(x, y+height-2*border_radius, 2*border_radius, 2*border_radius, 180*16, 90*16);

在此处输入图像描述

于 2022-02-03T20:57:49.103 回答
0

扩展 Romha Korev 的答案。这是一个只有圆角顶角(左上角,右上角)的盒子的例子。角落里的矩形是根据主矩形计算的!

qreal left = 5;
qreal top = 10;
qreal width = 100;
qreal height = 20;
QRectF rect(left, top, width, height);

QPainterPath path;
path.setFillRule( Qt::WindingFill );
path.addRoundedRect(rect, 5, 5 );
qreal squareSize = height/2;
path.addRect( QRect( left, top+height-squareSize, squareSize, squareSize) ); // Bottom left
path.addRect( QRect( (left+width)-squareSize, top+height-squareSize, squareSize, squareSize) ); // Bottom right
painter->drawPath( path.simplified() ); // Draw box (only rounded at top)
于 2016-03-15T15:41:26.803 回答