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

Posted

技术标签:

【中文标题】如何在 Qt 中的弹出窗口小部件上创建平滑的圆角【英文标题】:How to create smooth rounded corners on a popup widget in Qt 【发布时间】:2014-07-07 14:08:20 【问题描述】:

我已经找了好几个小时了 - 运气不好。

我有一个带有 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);

【问题讨论】:

【参考方案1】:
    使用Qt::Window | Qt::FramelessWindowHintQt::WA_TranslucentBackground 标志创建一个小部件 在小部件内创建QFrame

    设置样式表为QFrame,例如:

    边框:1px 纯红色;

    边框半径:20px;

    背景色:黑色;

【讨论】:

我不确定 linux。仅在 Mac / Win 上测试。

以上是关于如何在 Qt 中的弹出窗口小部件上创建平滑的圆角的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent

Kivy:弹出窗口只能有一个小部件作为内容(当我导入两个不同的弹出模块时)

如何在 jQuery Mobile 中等待弹出窗口关闭?

Qt/PyQt4/PySide QDateEdit 日历弹窗掉屏

SharePoint 中的空白弹出窗口

iscrollview 和 jquery 移动弹出窗口底部内容隐藏