使QOpenGLWidget的背景透明

方法其实Qt帮助文档已经说了,如下图。大意是如果你想让QOpenGLWidget下方的子Widget可见只需要设置Qt::WA_AlwaysStackOnTop属性就行了;如果QOpenGLWidget下方没有子Widget,只是想创建一个半透明的窗口,那么对顶层窗口(主窗口)使用传统的Qt::WA_TranslucentBackground属性就可以实现了。

下面我将给出一个例子,例子在VS2017和Qt5.9测试通过。在Qt设计师程序里把主窗口的CentralWidget提升为你自定义的QOpenGLWidget的子类,然后在内部添加几个控件。主窗口构造函数部分代码如下,Qt3DTest是主窗口类:

Qt3DTest::Qt3DTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    setWindowFlag(Qt::FramelessWindowHint); /* 1 */
    setAttribute(Qt::WA_TranslucentBackground); /* 2 */
}

上述代码把1启用而2注释掉的运行结果如下。图中的窗口边框“3D测试程序”那里是我自己设计的边框,并不是Windows系统提供的边框。可以看出来OpenGL没渲染到的地方是黑色:

把1、2同时启用的运行结果如下。此时没有渲染到的地方变成透明色:

 

posted @ 2024-04-21 15:38  兜尼完  阅读(439)  评论(0编辑  收藏  举报