QT4:带圆角的透明窗口

Posted

技术标签:

【中文标题】QT4:带圆角的透明窗口【英文标题】:QT4: Transparent Window with rounded corners 【发布时间】:2010-12-26 21:59:37 【问题描述】:

如何创建带有圆形边框(无标准边框)的部分透明窗口?

(我使用Qt::FramelessWindowHint 禁用标准边框)

我尝试了样式表,但border-radiusopacity 似乎对窗口没有任何影响,它只对封闭小部件的子级有效。

我的第二个想法是使窗口完全透明(使用setWindowOpacity),然后添加一个带有圆角的附加小部件(因为border-radius 对孩子有效),然后将我所有其他小部件组合到该小部件中.但这不起作用,因为setWindowOpacity 也会影响所有孩子(我还没有找到改变这种行为的方法)。

而且我能想到的任何使外部窗口透明的方法(如样式表opacity)都不能正常工作(我只得到一个黑盒子而不是透明窗口)

我们将不胜感激。

【问题讨论】:

【参考方案1】:

我有一个类似的问题,我想在***小部件上绘画并且只显示绘画的部分。 setWindowOpacity 改变了绘制部分的不透明度,这是我不想要的。

this->setAttribute(Qt::WA_TranslucentBackground, true);

更改了没有绘制部分的小部件的不透明度。我只是尝试折腾一个按钮,它也显示完全不透明。所以你应该可以随心所欲地显示其他孩子。

【讨论】:

谢谢!完美运行!【参考方案2】:

我认为您应该使用小部件掩码,如下面的 Qt 示例所示:

http://doc.qt.io/qt-5/qtwidgets-widgets-shapedclock-example.html

我想你会在里面找到你想要的!

希望这会有所帮助!

【讨论】:

是的,这可能是一个解决方案,但是创建带有圆角边框的矩形遮罩并不容易。好吧,我可以使用 QPixmaps 来获得这样的 QRegion,但是之后应用程序仍然可以扩展吗? 让它工作得很好:[code] QPixmap qpm(":/alphamask.png"); qpm = qpm.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); if (!qpm.isNull()) this->setMask(qpm.mask()); this->setWindowOpacity(0.9); [/code] 您好,我尝试在网上搜索有关 alpha 蒙版图像应该是什么样子的示例,但我没有找到任何示例。假设我有 Gimp 图像编辑器。什么应该在 alpha 图像映射中,以便它可以与 QPixmap 一起使用? (我不知道图像和图形)【参考方案3】:
 void MainForm::resizeEvent(QResizeEvent * /* event */)

    QImage image(this->size(), QImage::Format_Mono);
    image.fill(0);

    if(!this->isFullScreen() && !this->isMaximized())
    
        image.setPixel(0, 0, 1); image.setPixel(1, 0, 1); image.setPixel(2, 0, 1); image.setPixel(3, 0, 1);
        image.setPixel(0, 1, 1); image.setPixel(1, 1, 1);
        image.setPixel(0, 2, 1);
        image.setPixel(0, 3, 1);

        image.setPixel(width() - 4, 0, 1); image.setPixel(width() - 3, 0, 1); image.setPixel(width() - 2, 0, 1); image.setPixel(width() - 1, 0, 1);
                                                                              image.setPixel(width() - 2, 1, 1); image.setPixel(width() - 1, 1, 1);
                                                                                                                 image.setPixel(width() - 1, 2, 1);
                                                                                                                 image.setPixel(width() - 1, 3, 1);

        image.setPixel(0, height() - 4, 1);
        image.setPixel(0, height() - 3, 1);
        image.setPixel(0, height() - 2, 1); image.setPixel(1, height() - 2, 1);
        image.setPixel(0, height() - 1, 1); image.setPixel(1, height() - 1, 1); image.setPixel(2, height() - 1, 1); image.setPixel(3, height() - 1, 1);

                                                                                                                                                  image.setPixel(width() - 1, height() - 4, 1);
                                                                                                                                                  image.setPixel(width() - 1, height() - 3, 1);
                                                                                                    image.setPixel(width() - 2, height() - 2, 1); image.setPixel(width() - 1, height() - 2, 1);
        image.setPixel(width() - 4, height() - 1, 1); image.setPixel(width() - 3, height() - 1, 1); image.setPixel(width() - 2, height() - 1, 1); image.setPixel(width() - 1, height() - 1, 1);
    
    this->setMask(QPixmap::fromImage(image));

【讨论】:

你为什么把它放在resizeEvent中?

以上是关于QT4:带圆角的透明窗口的主要内容,如果未能解决你的问题,请参考以下文章

Qt Widget 利用 Qt4.5 实现酷炫透明窗体

透明背景在 WPF 中变黑

Delphi 代码实现窗口透明+圆角边框

UI-切圆角透明度取消按钮点击高亮效果按钮文字带下划线

简单的弹出拖拽窗口

WPF 创建无边框的圆角窗口