如何在 Qt 中的弹出窗口小部件上创建平滑的圆角

问题描述 投票:0回答:1

我有一个带有

windowsflag
Qt::Popup
设置的小部件,我正在尝试创建平滑的圆角。

我尝试使用样式表,但角的透明部分变成黑色。如果我覆盖小部件的绘制事件并在小部件中绘制带有圆角的矩形,也会发生同样的情况。

我也尝试过设置蒙版,但结果变得非常像素化。

经过一番阅读,我发现出现黑角是因为该小部件是顶级小部件。但我认为这仍然是可能的?

如何去除黑角或平滑面膜?

涂装活动:

void PopUp::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    QColor greyColor(0xFFC5C6C6);
    QRect rect(0, 0, width(), height());  
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(QBrush(greyColor));
    painter.setPen(QPen(greyColor));
    painter.drawRoundedRect(rect, 10, 10);
}

设置遮罩的功能:

void PopUp::setRoundedCorners(int radius)
{
    QRegion verticalRegion(0, radius, width(), height() - 2 * radius);
    QRegion horizontalRegion(radius, 0, width() - 2 * radius, height());
    QRegion circle(0, 0, 2 * radius, 2 * radius, QRegion::Ellipse);

    QRegion region = verticalRegion.united(horizontalRegion);
    region = region.united(circle);
    region = region.united(circle.translated(width() - 2 * radius, 0));
    region = region.united(circle.translated(width() - 2 * radius, height() - 2 * radius));
    region = region.united(circle.translated(0, height() - 2 * radius));

    setMask(region);
}
windows qt qt5 styling rounded-corners
1个回答
16
投票

1. 创建一个小部件并将其 windowFlags 设置为

Qt::Window | Qt::FramelessWindowHint
,并将其 attribute 设置为
Qt::WA_TranslucentBackground

2. 在小部件内创建一个

QFrame

3. 将样式表设置为

QFrame
,例如:

border: 1px solid red;
border-radius: 20px;
background-color: black;
© www.soinside.com 2019 - 2024. All rights reserved.