我正在开发一个应用程序,我需要使用 Painter 为像素图填充颜色。Pixmap 是具有(底边)2 个圆角的矩形类型。前 2 个角是平的/正常的。
我尝试使用 Qt 的 drawRoundedRect() API,但它使矩形的所有角都变圆了。我需要绘制只有 2 个圆角和其他两个平角的矩形。
如果有人遇到这种情况,请建议我解决方案。
谢谢
我正在开发一个应用程序,我需要使用 Painter 为像素图填充颜色。Pixmap 是具有(底边)2 个圆角的矩形类型。前 2 个角是平的/正常的。
我尝试使用 Qt 的 drawRoundedRect() API,但它使矩形的所有角都变圆了。我需要绘制只有 2 个圆角和其他两个平角的矩形。
如果有人遇到这种情况,请建议我解决方案。
谢谢
您可以为此使用 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
您可以使用样式表(在运行时或加载文件 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/
您也可以使用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);
代码:
// 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);
扩展 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)