ここに示されているsetAttribute( Qt.WA_TranslucentBackground, True)メソッド も機能します... トップレベル ウィンドウでこの属性を設定し、 paintEvent()メソッド オーバーライドで QPainterPath を使用してウィンドウの形状をペイントします。
角の丸い四角形の QPainterPath を作成またはペイントするのに役立つ(python)コードを次に示します。
def drawPartiallyRoundedRect(painter,x,y,w,h,
radiusTR, radiusBR, radiusBL, radiusTL,
doFill,fillColor,
doLine=False,lineColor=None,lineWidth=1,
antiAlias=True):
w2 = int(w/2.0)
h2 = int(h/2.0)
if (doLine):
x += lineWidth/2.0
y += lineWidth/2.0
w -= lineWidth
h -= lineWidth
T = y
L = x
R = x + w
B = y + h
# clamp values to fit within rect
if (radiusTR > w2):
radiusTR = w2
if (radiusTR > h2):
radiusTR = h2
if (radiusTL > w2):
radiusTL = w2
if (radiusTL > h2):
radiusTL = h2
if (radiusBL > w2):
radiusBL = w2
if (radiusBL > h2):
radiusBL = h2
if (radiusBR > w2):
radiusBR = w2
if (radiusBR > h2):
radiusBR = h2
diamTR = radiusTR + radiusTR
diamBR = radiusBR + radiusBR
diamBL = radiusBL + radiusBL
diamTL = radiusTL + radiusTL
p = QPainterPath()
if (radiusTR > 0.0):
p.moveTo(R, T + radiusTR);
p.arcTo(R-diamTR, T, diamTR, diamTR, 0.0, 90.0) # TR
else:
p.moveTo(R,T)
if (radiusTL > 0.0):
p.arcTo(L, T, diamTL, diamTL, 90.0, 90.0) # TL
else:
p.lineTo(L,T)
if (radiusBL > 0.0):
p.arcTo(L, B-diamBL, diamBL, diamBL, 180.0, 90.0); # BL
else:
p.lineTo(L,B)
if (radiusBR > 0.0):
p.arcTo(R-diamBR, B-diamBR, diamBR, diamBR, 270.0, 90.0); # BR
else:
p.lineTo(R,B)
p.closeSubpath();
if (antiAlias):
painter.setRenderHint(QPainter.Antialiasing,True)
else:
painter.setRenderHint(QPainter.Antialiasing,False)
if (doFill and fillColor):
painter.setBrush( fillColor )
elif ( doFill ): # pass doFill and None for fillColor to use current brush
pass
else:
painter.setBrush( Qt.NoBrush )
if ((lineWidth != 0.0) and doLine and lineColor):
pen = QPen( lineColor, lineWidth,
Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin )
painter.setPen( pen )
else:
painter.setPen( Qt.NoPen )
painter.drawPath( p )