// Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include #include #include class GLWindow : public QWindow { public: GLWindow(Qt::WindowFlags flags) : gl(0) { setFlags(flags); setSurfaceType(OpenGLSurface); QSurfaceFormat format; format.setAlphaBufferSize(8); format.setSamples(16); setFormat(format); } void exposeEvent(QExposeEvent *) { if (!isExposed()) return; if (!gl) { gl = new QOpenGLContext(); gl->setFormat(requestedFormat()); gl->create(); } gl->makeCurrent(this); QOpenGLShaderProgram prog; prog.addShaderFromSourceCode(QOpenGLShader::Vertex, "attribute highp vec4 a_Pos;" "attribute lowp vec4 a_Color;" "varying lowp vec4 v_Color;" "void main() {" " gl_Position = a_Pos;" " v_Color = a_Color;" "}"); prog.addShaderFromSourceCode(QOpenGLShader::Fragment, "varying lowp vec4 v_Color;" "void main() {" " gl_FragColor = v_Color;" "}"); prog.bind(); QOpenGLFunctions *functions = gl->functions(); functions->glClearColor(0, 0, 0, 0); functions->glClear(GL_COLOR_BUFFER_BIT); functions->glViewport(0, 0, width(), height()); prog.enableAttributeArray("a_Pos"); prog.enableAttributeArray("a_Color"); float coords[] = { -0.7f, 0.7f, 0.8f, 0.8f, -0.8f, -0.8f, 0.7f, -0.7f }; float colors[] = { 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0 }; prog.setAttributeArray("a_Pos", GL_FLOAT, coords, 2, 0); prog.setAttributeArray("a_Color", GL_FLOAT, colors, 4, 0); functions->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); prog.disableAttributeArray("a_Pos"); prog.disableAttributeArray("a_Color"); gl->swapBuffers(this); } void mousePressEvent(QMouseEvent *) { QCoreApplication::quit(); } private: QOpenGLContext *gl; }; class Widget : public QWidget { public: Widget(Qt::WindowFlags flags) : QWidget(0, flags) { setAttribute(Qt::WA_TranslucentBackground); } void paintEvent(QPaintEvent *) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing); p.fillRect(rect(), QColor("steelblue")); int w = width(); int h = height(); int w2 = width() / 2; int h2 = height() / 2; QPainterPath path; path.moveTo(0, 0); path.cubicTo(w2, 0, w2, h2, w, h); path.cubicTo(w2, h, w2, h2, 0, 0); QLinearGradient lg(0, 0, w, h); lg.setColorAt(0.0, Qt::transparent); lg.setColorAt(0.5, QColor("palegreen")); lg.setColorAt(1.0, Qt::transparent); p.setCompositionMode(QPainter::CompositionMode_Source); p.fillPath(path, lg); } void mousePressEvent(QMouseEvent *) { QCoreApplication::quit(); } }; int main(int argc, char **argv) { QApplication app(argc, argv); // mask: on/off // opacity: on/off for (int i=0; i<4; ++i) { bool mask = i & 0x1; bool opacity = i & 0x2; Qt::WindowFlags flags = Qt::FramelessWindowHint; Widget *widget = new Widget(flags); GLWindow *window = new GLWindow(flags); widget->setGeometry(100 + 100 * i, 100, 80, 80); window->setGeometry(100 + 100 * i, 200, 80, 80); if (mask) { QRegion region(0, 0, 80, 80, QRegion::Ellipse); widget->setMask(region); window->setMask(region); } if (opacity) { widget->setWindowOpacity(0.5); window->setOpacity(0.5); } widget->show(); window->show(); } return app.exec(); }