<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>window.cpp Example File | Qt Wayland Compositor 5.9</title> <link rel="stylesheet" type="text/css" href="style/offline-simple.css" /> <script type="text/javascript"> document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css"); // loading style sheet breaks anchors that were jumped to before // so force jumping to anchor again setTimeout(function() { var anchor = location.hash; // need to jump to different anchor first (e.g. none) location.hash = "#"; setTimeout(function() { location.hash = anchor; }, 0); }, 0); </script> </head> <body> <div class="header" id="qtdocheader"> <div class="main"> <div class="main-rounded"> <div class="navigationbar"> <table><tr> <td >Qt 5.9</td><td ><a href="qtwaylandcompositor-index.html">Qt Wayland Compositor</a></td><td ><a href="qtwaylandcompositor-qwindow-compositor-example.html">Qt Wayland Compositor Examples - QWindow Compositor</a></td><td >window.cpp Example File</td></tr></table><table class="buildversion"><tr> <td id="buildversion" width="100%" align="right">Qt 5.9.4 Reference Documentation</td> </tr></table> </div> </div> <div class="content"> <div class="line"> <div class="content mainContent"> <div class="sidebar"><div class="sidebar-content" id="sidebar-content"></div></div> <h1 class="title">window.cpp Example File</h1> <span class="subtitle">qwindow-compositor/window.cpp</span> <!-- $$$qwindow-compositor/window.cpp-description --> <div class="descr"> <a name="details"></a> <pre class="cpp"> <span class="comment">/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Wayland module ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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 The Qt Company Ltd 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$ ** ****************************************************************************/</span> <span class="preprocessor">#include "window.h"</span> <span class="preprocessor">#include <QMouseEvent></span> <span class="preprocessor">#include <QOpenGLWindow></span> <span class="preprocessor">#include <QOpenGLTexture></span> <span class="preprocessor">#include <QOpenGLFunctions></span> <span class="preprocessor">#include <QMatrix4x4></span> <span class="preprocessor">#include "compositor.h"</span> <span class="preprocessor">#include <QtWaylandCompositor/qwaylandseat.h></span> Window<span class="operator">::</span>Window() : m_backgroundTexture(<span class="number">0</span>) <span class="operator">,</span> m_compositor(<span class="number">0</span>) <span class="operator">,</span> m_grabState(NoGrab) <span class="operator">,</span> m_dragIconView(<span class="number">0</span>) { } <span class="type">void</span> Window<span class="operator">::</span>setCompositor(Compositor <span class="operator">*</span>comp) { m_compositor <span class="operator">=</span> comp; connect(m_compositor<span class="operator">,</span> <span class="operator">&</span>Compositor<span class="operator">::</span>startMove<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> <span class="operator">&</span>Window<span class="operator">::</span>startMove); connect(m_compositor<span class="operator">,</span> <span class="operator">&</span>Compositor<span class="operator">::</span>startResize<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> <span class="operator">&</span>Window<span class="operator">::</span>startResize); connect(m_compositor<span class="operator">,</span> <span class="operator">&</span>Compositor<span class="operator">::</span>dragStarted<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> <span class="operator">&</span>Window<span class="operator">::</span>startDrag); } <span class="type">void</span> Window<span class="operator">::</span>initializeGL() { <span class="type">QImage</span> backgroundImage <span class="operator">=</span> <span class="type">QImage</span>(QLatin1String(<span class="string">":/background.jpg"</span>))<span class="operator">.</span>rgbSwapped(); backgroundImage<span class="operator">.</span>invertPixels(); m_backgroundTexture <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QOpenGLTexture</span>(backgroundImage<span class="operator">,</span> <span class="type">QOpenGLTexture</span><span class="operator">::</span>DontGenerateMipMaps); m_backgroundTexture<span class="operator">-</span><span class="operator">></span>setMinificationFilter(<span class="type">QOpenGLTexture</span><span class="operator">::</span>Nearest); m_backgroundImageSize <span class="operator">=</span> backgroundImage<span class="operator">.</span>size(); m_textureBlitter<span class="operator">.</span>create(); } <span class="type">void</span> Window<span class="operator">::</span>drawBackground() { <span class="keyword">for</span> (<span class="type">int</span> y <span class="operator">=</span> <span class="number">0</span>; y <span class="operator"><</span> height(); y <span class="operator">+</span><span class="operator">=</span> m_backgroundImageSize<span class="operator">.</span>height()) { <span class="keyword">for</span> (<span class="type">int</span> x <span class="operator">=</span> <span class="number">0</span>; x <span class="operator"><</span> width(); x <span class="operator">+</span><span class="operator">=</span> m_backgroundImageSize<span class="operator">.</span>width()) { QMatrix4x4 targetTransform <span class="operator">=</span> <span class="type">QOpenGLTextureBlitter</span><span class="operator">::</span>targetTransform(<span class="type">QRect</span>(<span class="type">QPoint</span>(x<span class="operator">,</span>y)<span class="operator">,</span> m_backgroundImageSize)<span class="operator">,</span> <span class="type">QRect</span>(<span class="type">QPoint</span>(<span class="number">0</span><span class="operator">,</span><span class="number">0</span>)<span class="operator">,</span> size())); m_textureBlitter<span class="operator">.</span>blit(m_backgroundTexture<span class="operator">-</span><span class="operator">></span>textureId()<span class="operator">,</span> targetTransform<span class="operator">,</span> <span class="type">QOpenGLTextureBlitter</span><span class="operator">::</span>OriginTopLeft); } } } <span class="type">QPointF</span> Window<span class="operator">::</span>getAnchorPosition(<span class="keyword">const</span> <span class="type">QPointF</span> <span class="operator">&</span>position<span class="operator">,</span> <span class="type">int</span> resizeEdge<span class="operator">,</span> <span class="keyword">const</span> <span class="type">QSize</span> <span class="operator">&</span>windowSize) { <span class="type">float</span> y <span class="operator">=</span> position<span class="operator">.</span>y(); <span class="keyword">if</span> (resizeEdge <span class="operator">&</span> QWaylandXdgSurfaceV5<span class="operator">::</span>ResizeEdge<span class="operator">::</span>TopEdge) y <span class="operator">+</span><span class="operator">=</span> windowSize<span class="operator">.</span>height(); <span class="type">float</span> x <span class="operator">=</span> position<span class="operator">.</span>x(); <span class="keyword">if</span> (resizeEdge <span class="operator">&</span> QWaylandXdgSurfaceV5<span class="operator">::</span>ResizeEdge<span class="operator">::</span>LeftEdge) x <span class="operator">+</span><span class="operator">=</span> windowSize<span class="operator">.</span>width(); <span class="keyword">return</span> <span class="type">QPointF</span>(x<span class="operator">,</span> y); } <span class="type">QPointF</span> Window<span class="operator">::</span>getAnchoredPosition(<span class="keyword">const</span> <span class="type">QPointF</span> <span class="operator">&</span>anchorPosition<span class="operator">,</span> <span class="type">int</span> resizeEdge<span class="operator">,</span> <span class="keyword">const</span> <span class="type">QSize</span> <span class="operator">&</span>windowSize) { <span class="keyword">return</span> anchorPosition <span class="operator">-</span> getAnchorPosition(<span class="type">QPointF</span>()<span class="operator">,</span> resizeEdge<span class="operator">,</span> windowSize); } <span class="type">void</span> Window<span class="operator">::</span>paintGL() { m_compositor<span class="operator">-</span><span class="operator">></span>startRender(); <span class="type">QOpenGLFunctions</span> <span class="operator">*</span>functions <span class="operator">=</span> context()<span class="operator">-</span><span class="operator">></span>functions(); functions<span class="operator">-</span><span class="operator">></span>glClearColor(<span class="number">1.f</span><span class="operator">,</span> <span class="operator">.</span><span class="number">6f</span><span class="operator">,</span> <span class="operator">.</span><span class="number">0f</span><span class="operator">,</span> <span class="number">0.5f</span>); functions<span class="operator">-</span><span class="operator">></span>glClear(GL_COLOR_BUFFER_BIT <span class="operator">|</span> GL_DEPTH_BUFFER_BIT); m_textureBlitter<span class="operator">.</span>bind(); drawBackground(); functions<span class="operator">-</span><span class="operator">></span>glEnable(GL_BLEND); functions<span class="operator">-</span><span class="operator">></span>glBlendFunc(GL_SRC_ALPHA<span class="operator">,</span> GL_ONE_MINUS_SRC_ALPHA); GLenum currentTarget <span class="operator">=</span> GL_TEXTURE_2D; Q_FOREACH (View <span class="operator">*</span>view<span class="operator">,</span> m_compositor<span class="operator">-</span><span class="operator">></span>views()) { <span class="keyword">if</span> (view<span class="operator">-</span><span class="operator">></span>isCursor()) <span class="keyword">continue</span>; <span class="keyword">auto</span> texture <span class="operator">=</span> view<span class="operator">-</span><span class="operator">></span>getTexture(); <span class="keyword">if</span> (<span class="operator">!</span>texture) <span class="keyword">continue</span>; <span class="keyword">if</span> (texture<span class="operator">-</span><span class="operator">></span>target() <span class="operator">!</span><span class="operator">=</span> currentTarget) { currentTarget <span class="operator">=</span> texture<span class="operator">-</span><span class="operator">></span>target(); m_textureBlitter<span class="operator">.</span>bind(currentTarget); } <span class="type"><a href="qwaylandsurface.html">QWaylandSurface</a></span> <span class="operator">*</span>surface <span class="operator">=</span> view<span class="operator">-</span><span class="operator">></span>surface(); <span class="keyword">if</span> ((surface <span class="operator">&</span><span class="operator">&</span> surface<span class="operator">-</span><span class="operator">></span>hasContent()) <span class="operator">|</span><span class="operator">|</span> view<span class="operator">-</span><span class="operator">></span>isBufferLocked()) { <span class="type">QSize</span> s <span class="operator">=</span> view<span class="operator">-</span><span class="operator">></span>size(); <span class="keyword">if</span> (<span class="operator">!</span>s<span class="operator">.</span>isEmpty()) { <span class="keyword">if</span> (m_mouseView <span class="operator">=</span><span class="operator">=</span> view <span class="operator">&</span><span class="operator">&</span> m_grabState <span class="operator">=</span><span class="operator">=</span> ResizeGrab <span class="operator">&</span><span class="operator">&</span> m_resizeAnchored) view<span class="operator">-</span><span class="operator">></span>setPosition(getAnchoredPosition(m_resizeAnchorPosition<span class="operator">,</span> m_resizeEdge<span class="operator">,</span> s)); <span class="type">QPointF</span> pos <span class="operator">=</span> view<span class="operator">-</span><span class="operator">></span>position() <span class="operator">+</span> view<span class="operator">-</span><span class="operator">></span>parentPosition(); <span class="type">QRectF</span> surfaceGeometry(pos<span class="operator">,</span> s); <span class="keyword">auto</span> surfaceOrigin <span class="operator">=</span> view<span class="operator">-</span><span class="operator">></span>textureOrigin(); <span class="keyword">auto</span> sf <span class="operator">=</span> view<span class="operator">-</span><span class="operator">></span>animationFactor(); <span class="type">QRectF</span> targetRect(surfaceGeometry<span class="operator">.</span>topLeft() <span class="operator">*</span> sf<span class="operator">,</span> surfaceGeometry<span class="operator">.</span>size() <span class="operator">*</span> sf); QMatrix4x4 targetTransform <span class="operator">=</span> <span class="type">QOpenGLTextureBlitter</span><span class="operator">::</span>targetTransform(targetRect<span class="operator">,</span> <span class="type">QRect</span>(<span class="type">QPoint</span>()<span class="operator">,</span> size())); m_textureBlitter<span class="operator">.</span>blit(texture<span class="operator">-</span><span class="operator">></span>textureId()<span class="operator">,</span> targetTransform<span class="operator">,</span> surfaceOrigin); } } } functions<span class="operator">-</span><span class="operator">></span>glDisable(GL_BLEND); m_textureBlitter<span class="operator">.</span>release(); m_compositor<span class="operator">-</span><span class="operator">></span>endRender(); } View <span class="operator">*</span>Window<span class="operator">::</span>viewAt(<span class="keyword">const</span> <span class="type">QPointF</span> <span class="operator">&</span>point) { View <span class="operator">*</span>ret <span class="operator">=</span> <span class="number">0</span>; Q_FOREACH (View <span class="operator">*</span>view<span class="operator">,</span> m_compositor<span class="operator">-</span><span class="operator">></span>views()) { <span class="keyword">if</span> (view <span class="operator">=</span><span class="operator">=</span> m_dragIconView) <span class="keyword">continue</span>; <span class="type">QRectF</span> geom(view<span class="operator">-</span><span class="operator">></span>position()<span class="operator">,</span> view<span class="operator">-</span><span class="operator">></span>size()); <span class="keyword">if</span> (geom<span class="operator">.</span>contains(point)) ret <span class="operator">=</span> view; } <span class="keyword">return</span> ret; } <span class="type">void</span> Window<span class="operator">::</span>startMove() { m_grabState <span class="operator">=</span> MoveGrab; } <span class="type">void</span> Window<span class="operator">::</span>startResize(<span class="type">int</span> edge<span class="operator">,</span> bool anchored) { m_initialSize <span class="operator">=</span> m_mouseView<span class="operator">-</span><span class="operator">></span>windowSize(); m_grabState <span class="operator">=</span> ResizeGrab; m_resizeEdge <span class="operator">=</span> edge; m_resizeAnchored <span class="operator">=</span> anchored; m_resizeAnchorPosition <span class="operator">=</span> getAnchorPosition(m_mouseView<span class="operator">-</span><span class="operator">></span>position()<span class="operator">,</span> edge<span class="operator">,</span> m_mouseView<span class="operator">-</span><span class="operator">></span>surface()<span class="operator">-</span><span class="operator">></span>size()); } <span class="type">void</span> Window<span class="operator">::</span>startDrag(View <span class="operator">*</span>dragIcon) { m_grabState <span class="operator">=</span> DragGrab; m_dragIconView <span class="operator">=</span> dragIcon; m_compositor<span class="operator">-</span><span class="operator">></span>raise(dragIcon); } <span class="type">void</span> Window<span class="operator">::</span>mousePressEvent(<span class="type">QMouseEvent</span> <span class="operator">*</span>e) { <span class="keyword">if</span> (mouseGrab()) <span class="keyword">return</span>; <span class="keyword">if</span> (m_mouseView<span class="operator">.</span>isNull()) { m_mouseView <span class="operator">=</span> viewAt(e<span class="operator">-</span><span class="operator">></span>localPos()); <span class="keyword">if</span> (<span class="operator">!</span>m_mouseView) { m_compositor<span class="operator">-</span><span class="operator">></span>closePopups(); <span class="keyword">return</span>; } <span class="keyword">if</span> (e<span class="operator">-</span><span class="operator">></span>modifiers() <span class="operator">=</span><span class="operator">=</span> <span class="type">Qt</span><span class="operator">::</span>AltModifier <span class="operator">|</span><span class="operator">|</span> e<span class="operator">-</span><span class="operator">></span>modifiers() <span class="operator">=</span><span class="operator">=</span> <span class="type">Qt</span><span class="operator">::</span>MetaModifier) m_grabState <span class="operator">=</span> MoveGrab; <span class="comment">//start move</span> <span class="keyword">else</span> m_compositor<span class="operator">-</span><span class="operator">></span>raise(m_mouseView); m_initialMousePos <span class="operator">=</span> e<span class="operator">-</span><span class="operator">></span>localPos(); m_mouseOffset <span class="operator">=</span> e<span class="operator">-</span><span class="operator">></span>localPos() <span class="operator">-</span> m_mouseView<span class="operator">-</span><span class="operator">></span>position(); <span class="type">QMouseEvent</span> moveEvent(<span class="type">QEvent</span><span class="operator">::</span>MouseMove<span class="operator">,</span> e<span class="operator">-</span><span class="operator">></span>localPos()<span class="operator">,</span> e<span class="operator">-</span><span class="operator">></span>globalPos()<span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>NoButton<span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>NoButton<span class="operator">,</span> e<span class="operator">-</span><span class="operator">></span>modifiers()); sendMouseEvent(<span class="operator">&</span>moveEvent<span class="operator">,</span> m_mouseView); } sendMouseEvent(e<span class="operator">,</span> m_mouseView); } <span class="type">void</span> Window<span class="operator">::</span>mouseReleaseEvent(<span class="type">QMouseEvent</span> <span class="operator">*</span>e) { <span class="keyword">if</span> (<span class="operator">!</span>mouseGrab()) sendMouseEvent(e<span class="operator">,</span> m_mouseView); <span class="keyword">if</span> (e<span class="operator">-</span><span class="operator">></span>buttons() <span class="operator">=</span><span class="operator">=</span> <span class="type">Qt</span><span class="operator">::</span>NoButton) { <span class="keyword">if</span> (m_grabState <span class="operator">=</span><span class="operator">=</span> DragGrab) { View <span class="operator">*</span>view <span class="operator">=</span> viewAt(e<span class="operator">-</span><span class="operator">></span>localPos()); m_compositor<span class="operator">-</span><span class="operator">></span>handleDrag(view<span class="operator">,</span> e); } m_mouseView <span class="operator">=</span> <span class="number">0</span>; m_grabState <span class="operator">=</span> NoGrab; } } <span class="type">void</span> Window<span class="operator">::</span>mouseMoveEvent(<span class="type">QMouseEvent</span> <span class="operator">*</span>e) { <span class="keyword">switch</span> (m_grabState) { <span class="keyword">case</span> NoGrab: { View <span class="operator">*</span>view <span class="operator">=</span> m_mouseView <span class="operator">?</span> m_mouseView<span class="operator">.</span>data() : viewAt(e<span class="operator">-</span><span class="operator">></span>localPos()); sendMouseEvent(e<span class="operator">,</span> view); <span class="keyword">if</span> (<span class="operator">!</span>view) setCursor(<span class="type">Qt</span><span class="operator">::</span>ArrowCursor); } <span class="keyword">break</span>; <span class="keyword">case</span> MoveGrab: { m_mouseView<span class="operator">-</span><span class="operator">></span>setPosition(e<span class="operator">-</span><span class="operator">></span>localPos() <span class="operator">-</span> m_mouseOffset); update(); } <span class="keyword">break</span>; <span class="keyword">case</span> ResizeGrab: { <span class="type">QPoint</span> delta <span class="operator">=</span> (e<span class="operator">-</span><span class="operator">></span>localPos() <span class="operator">-</span> m_initialMousePos)<span class="operator">.</span>toPoint(); m_compositor<span class="operator">-</span><span class="operator">></span>handleResize(m_mouseView<span class="operator">,</span> m_initialSize<span class="operator">,</span> delta<span class="operator">,</span> m_resizeEdge); } <span class="keyword">break</span>; <span class="keyword">case</span> DragGrab: { View <span class="operator">*</span>view <span class="operator">=</span> viewAt(e<span class="operator">-</span><span class="operator">></span>localPos()); m_compositor<span class="operator">-</span><span class="operator">></span>handleDrag(view<span class="operator">,</span> e); <span class="keyword">if</span> (m_dragIconView) { m_dragIconView<span class="operator">-</span><span class="operator">></span>setPosition(e<span class="operator">-</span><span class="operator">></span>localPos() <span class="operator">+</span> m_dragIconView<span class="operator">-</span><span class="operator">></span>offset()); update(); } } <span class="keyword">break</span>; } } <span class="type">void</span> Window<span class="operator">::</span>sendMouseEvent(<span class="type">QMouseEvent</span> <span class="operator">*</span>e<span class="operator">,</span> View <span class="operator">*</span>target) { <span class="type">QPointF</span> mappedPos <span class="operator">=</span> e<span class="operator">-</span><span class="operator">></span>localPos(); <span class="keyword">if</span> (target) mappedPos <span class="operator">-</span><span class="operator">=</span> target<span class="operator">-</span><span class="operator">></span>position(); <span class="type">QMouseEvent</span> viewEvent(e<span class="operator">-</span><span class="operator">></span>type()<span class="operator">,</span> mappedPos<span class="operator">,</span> e<span class="operator">-</span><span class="operator">></span>localPos()<span class="operator">,</span> e<span class="operator">-</span><span class="operator">></span>button()<span class="operator">,</span> e<span class="operator">-</span><span class="operator">></span>buttons()<span class="operator">,</span> e<span class="operator">-</span><span class="operator">></span>modifiers()); m_compositor<span class="operator">-</span><span class="operator">></span>handleMouseEvent(target<span class="operator">,</span> <span class="operator">&</span>viewEvent); } <span class="type">void</span> Window<span class="operator">::</span>keyPressEvent(<span class="type">QKeyEvent</span> <span class="operator">*</span>e) { m_compositor<span class="operator">-</span><span class="operator">></span>defaultSeat()<span class="operator">-</span><span class="operator">></span>sendKeyPressEvent(e<span class="operator">-</span><span class="operator">></span>nativeScanCode()); } <span class="type">void</span> Window<span class="operator">::</span>keyReleaseEvent(<span class="type">QKeyEvent</span> <span class="operator">*</span>e) { m_compositor<span class="operator">-</span><span class="operator">></span>defaultSeat()<span class="operator">-</span><span class="operator">></span>sendKeyReleaseEvent(e<span class="operator">-</span><span class="operator">></span>nativeScanCode()); } </pre> </div> <!-- @@@qwindow-compositor/window.cpp --> </div> </div> </div> </div> </div> <div class="footer"> <p> <acronym title="Copyright">©</acronym> 2017 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners.<br> The documentation provided herein is licensed under the terms of the <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation License version 1.3</a> as published by the Free Software Foundation.<br> Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners. </p> </div> </body> </html>