From 32e78f4b6cc0e0ef710259ae73c39bf607cbb743 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Fri, 24 May 2013 14:09:01 +0200 Subject: Manual test for window transparency Change-Id: I8b9fdd14382904b5a0c2a1ecaabf01b209034b95 Reviewed-by: Friedemann Kleint --- tests/manual/manual.pro | 5 +- .../windowtransparency/windowtransparency.cpp | 200 +++++++++++++++++++++ .../windowtransparency/windowtransparency.pro | 6 + 3 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 tests/manual/windowtransparency/windowtransparency.cpp create mode 100644 tests/manual/windowtransparency/windowtransparency.pro diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro index 4a466aa472..d97c69025b 100644 --- a/tests/manual/manual.pro +++ b/tests/manual/manual.pro @@ -38,7 +38,8 @@ windowmodality \ widgetgrab \ xembed-raster \ xembed-widgets \ -dialogs +dialogs \ +windowtransparency !contains(QT_CONFIG, openssl):!contains(QT_CONFIG, openssl-linked):SUBDIRS -= qssloptions @@ -49,4 +50,4 @@ win32 { } lessThan(QT_MAJOR_VERSION, 5): SUBDIRS -= bearerex lance qnetworkaccessmanager/qget qnetworkreply \ -qpainfo qscreen socketengine xembed-raster xembed-widgets +qpainfo qscreen socketengine xembed-raster xembed-widgets windowtransparency diff --git a/tests/manual/windowtransparency/windowtransparency.cpp b/tests/manual/windowtransparency/windowtransparency.cpp new file mode 100644 index 0000000000..e90fee82f6 --- /dev/null +++ b/tests/manual/windowtransparency/windowtransparency.cpp @@ -0,0 +1,200 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#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(); + + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + 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); + + 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(); +} diff --git a/tests/manual/windowtransparency/windowtransparency.pro b/tests/manual/windowtransparency/windowtransparency.pro new file mode 100644 index 0000000000..0de5c6feb5 --- /dev/null +++ b/tests/manual/windowtransparency/windowtransparency.pro @@ -0,0 +1,6 @@ +QT += widgets + +SOURCES += \ + windowtransparency.cpp + +CONFIG += console -- cgit v1.2.3