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

5

我已经搜索了几个小时,但运气不太好。

我有一个窗口标志为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);
}
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;

我不确定Linux系统。只在Mac/Win上测试过。 - Dmitry Sazonov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接