C++ Qt绘制带边框的填充圆形矩形

C++ Qt绘制带边框的填充圆形矩形,c++,qt,rectangles,rounded-corners,qpainter,C++,Qt,Rectangles,Rounded Corners,Qpainter,我想画一个圆角矩形(所有4个角的边框半径相同),用特定的颜色填充整个矩形,并用单独的边框颜色(假设边框宽度为1像素) 根据我的观察,Qt提供了三种方法-fillRect和drawRect和drawRoundedRect。我试过了,但效果不理想。没有类似于fillRoundedRect的方法。这意味着我可以画一个圆角矩形,但它不会被我想要的颜色填充 我该怎么做?此外,我还了解到,由于一些别名问题,角点通常被渲染为不相等。如何将这四个变量设置为相等?painter.setRenderInt(QPai

我想画一个圆角矩形(所有4个角的边框半径相同),用特定的颜色填充整个矩形,并用单独的边框颜色(假设边框宽度为1像素)

根据我的观察,Qt提供了三种方法-
fillRect
drawRect
drawRoundedRect
。我试过了,但效果不理想。没有类似于
fillRoundedRect
的方法。这意味着我可以画一个圆角矩形,但它不会被我想要的颜色填充


我该怎么做?此外,我还了解到,由于一些别名问题,角点通常被渲染为不相等。如何将这四个变量设置为相等?
painter.setRenderInt(QPainter::Antialiasing)
就足够了吗?或者我还需要做其他事情吗?

您可以创建一个
QPainterPath
,将圆角矩形添加到其中,然后填充并笔划它:

QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
QPainterPath path;
path.addRoundedRect(QRectF(10, 10, 100, 50), 10, 10);
QPen pen(Qt::black, 10);
p.setPen(pen);
p.fillPath(path, Qt::red);
p.drawPath(path);
请注意,即使使用抗锯齿,1px边框也可能永远不会看起来很好,尤其是在低DPI桌面显示器上,在高DPI移动设备上,它几乎是不可见的

如果将矩形创建为
QRectF(9.5,9.5,100,50)
则使用1 px抗锯齿边框会更好,因为它会“捕捉”右侧像素:

上面的答案(来自@dtech)效果很好,但有时会导致圆形选区周围的边界不平。使用
qpaint.strokePath()
而不是
qpaint.drawPath()
可以解决此问题

下面是
QPushButton
的python实现,重新实现了
paintEvent

#我使用PySide6,但任何库都应该工作。
从PySide6.QtWidgets导入QPushButton
从PySide6.QtGui导入QPainter、QPainterPath、QBrush、QPen
从PySide6.QtCore导入Qt、QRectF
类圆形按钮(QPushButton):
def u u init u u;(self、text、bordersize、outlineColor、fillColor):
super(RoundedButton,self)。\uuuu init\uuuuu()
self.bordersize=bordersize
self.outlineColor=outlineColor
self.fillColor=fillColor
self.setText(文本)
def paintEvent(自身,事件):
#创造画家
油漆工=油漆工(自身)
painter.setRenderInt(QPainter.AntiAlias)
#创建路径
路径=QPainterPath()
#将画师颜色设置为给定值。
pen=QPen(self.outlineColor、self.bordersize)
画师:画笔
画笔=QBrush(self.fillColor)
画师:画笔(画笔)
rect=QRectF(event.rect())
#略微收缩尺寸以说明边框大小。
矩形调整(self.bordersize/2,self.bordersize/2,-self.bordersize/2,-self.bordersize/2)
#将rect添加到路径。
path.addRoundedRect(rect,10,10)
画师:setClipPath(路径)
#填充形状,绘制边框并将文本居中。
painter.fillPath(路径,painter.brush())
painter.strokePath(路径,painter.pen())
painter.drawText(rect、Qt.AlignCenter、self.text())

我不是Qt方面的专家,但我很确定我确实看到了这个问题:-P…似乎只有一个答案,我也看到了。我仍然问这个问题,因为它没有解决边界问题,以及可能出现的不均匀角。而且,如果你指的是这个问题,它也没有解决如何用颜色填充矩形-就像一个魅力!但是,我需要一个很薄的边框,比如说1像素的宽度。当我改变宽度时,边角看起来有点粗糙和锯齿状。即使使用抗锯齿。任何解决方案?@ HbButTouSi——如果你在一个小部件上绘制,那么在它的绘画事件中,如果你在另一个绘图设备上绘制,那就没关系了。这个问题被特别地标记为C++问题。请避免在其他语言中添加答案,因为这会给答案增加噪音,并可能会给将来的读者带来困惑。python代码现在已被删除。@UmbralReaper Qt的情况很特殊,因为许多语言中都有绑定,但python中有很多活动,因此举一个例子会有很大帮助。这不是一个关于C++本身的问题,而是关于QT技术的。@ EyLLANESC,我在回答其他QT问题时会记住这一点。@ UBRALRePARCH更改<代码> ReCT= QRAPF(…<代码> >代码> Rect。调整(BordErrest/ 2,BaldSead / 2,-BrimeSead,-BrimSead)< /Cord>