QT4:带圆角的透明窗口

时间:2009-12-15 17:36:41

标签: c++ user-interface qt qt4

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

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

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

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

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

任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:16)

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

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

在没有绘制部分的情况下更改了窗口小部件的不透明度。我只是试着扔一个按钮,这也显示完全不透明。所以你 应该能够显示你喜欢的其他孩子。

答案 1 :(得分:7)

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

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

我想你会找到你正在寻找的东西!

希望这有点帮助!

答案 2 :(得分:2)

 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));
}