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

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

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

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

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

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

我们将不胜感激。

【问题讨论】:

    标签: c++ user-interface qt qt4


    【解决方案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中?
    猜你喜欢
    • 2017-12-28
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多