Basic Drawing Example¶
The Basic Drawing example shows how to display basic graphics primitives in a variety of styles using the QPainter class.
QPainter performs low-level painting on widgets and other paint devices. The class can draw everything from simple lines to complex shapes like pies and chords. It can also draw aligned text and pixmaps. Normally, it draws in a “natural” coordinate system, but it can in addition do view and world transformation.
# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00\x02\x15\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x00P\x00\x00\x00P\x04\x03\x00\x00\x00|?\xef\x9e\
\x00\x00\x00\x15PLTE\xa3\xc2\x00\xf4\xf8\xe1\x8a\xa1\
\x09\x14\x14\x18?G\x16\xd3\xe2\x86p\x82\x0e\xfd\x17\x22\
9\x00\x00\x00\x09pHYs\x00\x00\x00H\x00\x00\x00\
H\x00F\xc9k>\x00\x00\x01\xa6IDATH\xc7\
\xedVKn\x840\x0cEf\xc49\xa2I\xd55\x22\
\x11k\xd4Hs\x0eT\x10\xf7?B\x0b\xc4L\xfc\x83\
\xd9u\xd1\xf1\x0a\xa2\x97\x17\xdb\xb1\x9fSUo\xfbk\
\xbb/\xcb\xfd\x1a\x05s\x0a\xbf\x16\x1f\xee\x1c\xd7l\xb0\
\x0d:\x9e\xe2Ba\xe3\x8b\xb8\x13$$\x0a\x8c\x96\x9f\
S`\xd6\xeb\xb8[\x106\xa8\xc0$\x81\xf1EB\x9d\
\x12\x09\xe3cY\xe6dSbj\xf6+\x81\xd9\xa4\xf4\
\x19\x87\xff\x1fV\xe0\x89\xaf\xe7d9=\x14'\xd2?\
\xa8'\x7f\xc9\xbd\x9dz\xf2\x93n\xc45\x167\xb0\xdd\
~u\xb6VJ\xe3F\xd7`\xfb\x06\xc5\xc9\x9a\x9e\xe2\
\xf7\xf8\x93tr\x22K\x90\xe9k\x99\xc9D\x0e\xf1\x19\
\xd0\xc8hR\x99D\xc0\x02\x07\x91r [\xf3m\xb6\
l\xffQ\x11=%\x5c\x9d\x9cx~\x080\x13v\xf8\
9\xf04v\x94\xd0a\xd6\x04\xb0\x15\x84\xfb\xba\x01\x84\
\xb2\xa9u\xe0P\x12\xf6\xd5\x05#\x84k\xc6\xb6 \xcc\
\x9473j\xa0\xca#\xa2>\xf2\xe8\xa9\x9ex\x15\x18\
\x09\xa1~3x\xd75\x93(q\xd7\xb8\x02T\x1f\x81\
6RY\x8f\x9bS\x1d\xe6R\xa9G\xacp(\x98B\
\x98d\x85\x1f=\xb3wK\x11<\xeb\x99\xa3\x0bas\
\x1eL\xe5{\xf6\xb5\xef*\x9aO\xa7)\x85\xcb\x1aQ\
PFU{:\xae\x82R{\x1av\x0e\x98\xe2\xcc\xf5\
\x11)-\xc5=\x90\xb35\xbeP\xc3{\xaa\xe1\xa66\
\xb3\xa9\xa0Q\xaas\xe6\x94\x92\xdbx1\x84O\xa6\xd7\
\xa4\xe2\xe2\x0b\xf3z\xb2\xc6a\x93d\x85\xc7\x8b\xb7\xc7\
\x1e\x84\xb7F6\x7f\xa5\x80A\xb8\xda\x92\xdf=\xf9b\
\x87\xb3\x97\xd4\xe7\xf7\xf1\x92\x02\xf7~Y\xfe?\xfb\x01\
\xbd\xf6\xdd\x91\xa2\xf3\xda\xd4\x00\x00\x00\x00IEND\
\xaeB`\x82\
\x00\x00\x03X\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x00 \x00\x00\x00\x10\x08\x02\x00\x00\x00\xf8b\xea\x0e\
\x00\x00\x00\x04gAMA\x00\x00\xb1\x8e|\xfbQ\x93\
\x00\x00\x00 cHRM\x00\x00z%\x00\x00\x80\x83\
\x00\x00\xf9\xff\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\
\x00\x00:\x97\x00\x00\x17o\x97\xa9\x99\xd4\x00\x00\x02\xe3\
IDAT8\xcbE\x94\xcb\x8d\x1eE\x10\xc7\x7fU\
\xd53\xb3\xf6j\x9d\x09I\x90\x04\x0e\x05\x09\x99x\xe0\
\xc4\xc1\x12\x07B \x04\x08\xc1\x96\xd7\xcb\xb7\xf3\xcd\xf4\
\xa3\xaa8L[\xees\xbd\xfa\xff\x92\xcf\xff\xfc\xa6\x86\
\x1a(* dB\x92A\x048\x1e\xa4\x93A89\
@\x11A\x94\x8cY\x93WABb+e\xc3\x16\xac\
\x85\xf7?\xbd/\x08\xf5\xf6o\xd9P%\x0c5\xc4\
H\xc7;1\x18\x8d\x18\xa4\x13Nt| \x82\x16\x80\
t\xdc\xf1F\x0c\xc2\x11\x00\xa4\xb0\xbc\xe1\xe1\x09\xdb\xf8\
\xf5\xc3\x87\x0c\x8a\x1a\xaa\xd4\x97\xbf\xcb\x82.\xf3\x04\x9c\
\xa8\xd4\x9d~\xa7\x9f\xf3\xd8\xd1\xf0\x93p\xb4 \x82w\
\xfa\xc1h\x10D\x02\xa8b\x0b\xeb#\xfd\x1d\x7f\xfe\xf5\
1\x02Q\x8a\x16\xd4\x10\xa5\xdd>ja{\x22 \x06\
}\xe7\xfc\xc2\xf9\x1f\xc73\xf5u\x82\xd0vFE\x94\
\x18x\xa7\xef\x8c\x8e*\xde\xc9\xc4\x0a\xdb;\x1e\x9eX\
\x1e\xf1\x0e\x01PD\x10\xc3\x0aa\x94\x07\xca\x86.\x84\
\x93\x01L2\xc6\x81\x0f\xd2i\x07^\x01\xc4\x88\x81\x18\
\x0c\xbc3\x1a\xd1\xf1B\xd9h\x85Lb\x90I\x06\xe5\
\xc2T\x0cQlE\x0b\x19d\xe2\x83v\xe7\xf8J\xdb\
Ihw\xc6\x9d\xd1\x89A\x06\xb6 J?!\x18\x8d\
\xbe\x93I\x11\xbca\x1b\xfd\xa0\xef\x8c\x13\xef\x17\x07\x05\
QD\x11!\x9cQ\xa97\xce\x17\x8e\xaf\xd4\xdb\xe4`\
\x9c\xdc\xbf\x90\x17\xb7\x83\xf5\x11Q\xfa}v\x89\x92\x8e\
\x08\x11x\x87\xa4\x9f\xf4\x93Q/\x88\x14\xb9x\x1b\x8c\
\xca\xf9\xc2\xf1\xc2\xf1<\xfb\xc9\x89\xd5hx\xbb\xb4B\
\x0c\x80QQ\xa3l,o!'n^Q\x9d\xda\x8d\
\xa0D\x00\x98\x12+\x80W\xfaI\xbbQo\xb4W2\
\x09g\x1cd\xa0\x85~\xc7;Z\xe8\x8a\x15\xc89\xb7\
\xac\x08\x88R\x1e\xa6\x823A )\x17\x99b\xa8\x11\
\x8ew\xbc\x11A8u\xa7\x1fS\x91\xa3~\xf7\x97w\
2\x88\x95p`\xee6\xc3\x16\x96G2\xbeA\xa7 \
\x14Q\x08b\xd0\x0eT\x19\x95\xe8Lb\x8cLFe\
\x1c\xd4\x1d?I\x07!\x83\x14\xa2\x91I\xef\xa0\xaco\
\x91\x85d\xb2}\xad\xbc\x0e*\x99x\xa7\xed\xec\x9f\xb0\
\x85\x18\x93\x0f5\xcaJ7\x86S_i\xfb4\xd4%\
A5\x10F#\x1d5\xfa\x1d5\xb2\x93\x81(j\x13\
\x15[(1\xe8\x07\xf7g\xf6O\xacO\xa8\xe1\x8dQ\
!\xb0\x82\x95\xefn\xb8\xac$B\x0f`\xc6Cy\x83\
m\x84\xd3O\x00\xdb\xe6\xee\xebD+\x94p|\xf0\xc7\
\xef\x1f#\xd8\x9e\xa6K\x11\xa2\xd1v\xda\x9d\xfaJ\xbb\
1*\x97\xf5/Ef\x80 \x8a\x1eX\xc5\xf6\xc9\xa2\
\x1a\xba\x00\x94o\x9bJ8\xbf\xfc\xfc\xe12\x9e\xad\x88\
\xccT\xf1A\xdd\x89+\xf2\xeaL\xba\xab\x87+h\xa1\
\xac\xe8\x82tTA\xd0\x05U\x00QtA\x8dL\xe4\
\xc7\x1f@g\x16^\xc0]\xef\x92S\xe6\x84>\x06\x04\
W]\x06\xe4\xfcAY\xbf\xb5\x08Wn\x8a\xce9\x97\
\xe4\xfe\x07\xb6\x84\x15$\x5c\xbcO\xce\x00\x00\x00\x00I\
END\xaeB`\x82\
"
qt_resource_name = b"\
\x00\x06\
\x07\x03}\xc3\
\x00i\
\x00m\x00a\x00g\x00e\x00s\
\x00\x0b\
\x05R\xbf'\
\x00q\
\x00t\x00-\x00l\x00o\x00g\x00o\x00.\x00p\x00n\x00g\
\x00\x09\
\x0f\x9e\x84G\
\x00b\
\x00r\x00i\x00c\x00k\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01z\xe7\xee'\x09\
\x00\x00\x00.\x00\x00\x00\x00\x00\x01\x00\x00\x02\x19\
\x00\x00\x01z\xe7\xee'\x09\
"
def qInitResources():
QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/brick.png</file>
<file>images/qt-logo.png</file>
</qresource>
</RCC>
"""PySide6 port of the widgets/painting/basicdrawing example from Qt v5.x, originating from PyQt"""
from PySide6.QtCore import QPoint, QRect, QSize, Qt, qVersion
from PySide6.QtGui import (QBrush, QConicalGradient, QLinearGradient, QPainter,
QPainterPath, QPalette, QPen, QPixmap, QPolygon, QRadialGradient)
from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QGridLayout,
QLabel, QSpinBox, QWidget)
import basicdrawing_rc
class RenderArea(QWidget):
points = QPolygon([
QPoint(10, 80),
QPoint(20, 10),
QPoint(80, 30),
QPoint(90, 70)
])
(Line, Points, Polyline, Polygon, Rect, RoundedRect, Ellipse,
Arc, Chord, Pie, Path, Text, Pixmap) = range(13)
def __init__(self, parent=None):
super().__init__(parent)
self.pen = QPen()
self.brush = QBrush()
self.pixmap = QPixmap()
self.shape = RenderArea.Polygon
self.antialiased = False
self.transformed = False
self.pixmap.load(':/images/qt-logo.png')
self.setBackgroundRole(QPalette.Base)
self.setAutoFillBackground(True)
def minimumSizeHint(self):
return QSize(100, 100)
def sizeHint(self):
return QSize(400, 200)
def set_shape(self, shape):
self.shape = shape
self.update()
def set_pen(self, pen):
self.pen = pen
self.update()
def set_brush(self, brush):
self.brush = brush
self.update()
def set_antialiased(self, antialiased):
self.antialiased = antialiased
self.update()
def set_transformed(self, transformed):
self.transformed = transformed
self.update()
def paintEvent(self, event):
rect = QRect(10, 20, 80, 60)
path = QPainterPath()
path.moveTo(20, 80)
path.lineTo(20, 30)
path.cubicTo(80, 0, 50, 50, 80, 80)
start_angle = 30 * 16
arc_length = 120 * 16
painter = QPainter(self)
painter.setPen(self.pen)
painter.setBrush(self.brush)
if self.antialiased:
painter.setRenderHint(QPainter.Antialiasing)
for x in range(0, self.width(), 100):
for y in range(0, self.height(), 100):
painter.save()
painter.translate(x, y)
if self.transformed:
painter.translate(50, 50)
painter.rotate(60.0)
painter.scale(0.6, 0.9)
painter.translate(-50, -50)
if self.shape == RenderArea.Line:
painter.drawLine(rect.bottomLeft(), rect.topRight())
elif self.shape == RenderArea.Points:
painter.drawPoints(RenderArea.points)
elif self.shape == RenderArea.Polyline:
painter.drawPolyline(RenderArea.points)
elif self.shape == RenderArea.Polygon:
painter.drawPolygon(RenderArea.points)
elif self.shape == RenderArea.Rect:
painter.drawRect(rect)
elif self.shape == RenderArea.RoundedRect:
painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
elif self.shape == RenderArea.Ellipse:
painter.drawEllipse(rect)
elif self.shape == RenderArea.Arc:
painter.drawArc(rect, start_angle, arc_length)
elif self.shape == RenderArea.Chord:
painter.drawChord(rect, start_angle, arc_length)
elif self.shape == RenderArea.Pie:
painter.drawPie(rect, start_angle, arc_length)
elif self.shape == RenderArea.Path:
painter.drawPath(path)
elif self.shape == RenderArea.Text:
qv = qVersion()
painter.drawText(rect, Qt.AlignCenter,
f"PySide 6\nQt {qv}")
elif self.shape == RenderArea.Pixmap:
painter.drawPixmap(10, 10, self.pixmap)
painter.restore()
painter.setPen(self.palette().dark().color())
painter.setBrush(Qt.NoBrush)
painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
# QPainter needs an explicit end() in PyPy. This will become a context manager in 6.3.
painter.end()
id_role = Qt.UserRole
class Window(QWidget):
def __init__(self):
super().__init__()
self._render_area = RenderArea()
self._shape_combo_box = QComboBox()
self._shape_combo_box.addItem("Polygon", RenderArea.Polygon)
self._shape_combo_box.addItem("Rectangle", RenderArea.Rect)
self._shape_combo_box.addItem("Rounded Rectangle", RenderArea.RoundedRect)
self._shape_combo_box.addItem("Ellipse", RenderArea.Ellipse)
self._shape_combo_box.addItem("Pie", RenderArea.Pie)
self._shape_combo_box.addItem("Chord", RenderArea.Chord)
self._shape_combo_box.addItem("Path", RenderArea.Path)
self._shape_combo_box.addItem("Line", RenderArea.Line)
self._shape_combo_box.addItem("Polyline", RenderArea.Polyline)
self._shape_combo_box.addItem("Arc", RenderArea.Arc)
self._shape_combo_box.addItem("Points", RenderArea.Points)
self._shape_combo_box.addItem("Text", RenderArea.Text)
self._shape_combo_box.addItem("Pixmap", RenderArea.Pixmap)
shape_label = QLabel("&Shape:")
shape_label.setBuddy(self._shape_combo_box)
self._pen_width_spin_box = QSpinBox()
self._pen_width_spin_box.setRange(0, 20)
self._pen_width_spin_box.setSpecialValueText("0 (cosmetic pen)")
pen_width_label = QLabel("Pen &Width:")
pen_width_label.setBuddy(self._pen_width_spin_box)
self._pen_style_combo_box = QComboBox()
self._pen_style_combo_box.addItem("Solid", Qt.SolidLine)
self._pen_style_combo_box.addItem("Dash", Qt.DashLine)
self._pen_style_combo_box.addItem("Dot", Qt.DotLine)
self._pen_style_combo_box.addItem("Dash Dot", Qt.DashDotLine)
self._pen_style_combo_box.addItem("Dash Dot Dot", Qt.DashDotDotLine)
self._pen_style_combo_box.addItem("None", Qt.NoPen)
pen_style_label = QLabel("&Pen Style:")
pen_style_label.setBuddy(self._pen_style_combo_box)
self._pen_cap_combo_box = QComboBox()
self._pen_cap_combo_box.addItem("Flat", Qt.FlatCap)
self._pen_cap_combo_box.addItem("Square", Qt.SquareCap)
self._pen_cap_combo_box.addItem("Round", Qt.RoundCap)
pen_cap_label = QLabel("Pen &Cap:")
pen_cap_label.setBuddy(self._pen_cap_combo_box)
self._pen_join_combo_box = QComboBox()
self._pen_join_combo_box.addItem("Miter", Qt.MiterJoin)
self._pen_join_combo_box.addItem("Bevel", Qt.BevelJoin)
self._pen_join_combo_box.addItem("Round", Qt.RoundJoin)
pen_join_label = QLabel("Pen &Join:")
pen_join_label.setBuddy(self._pen_join_combo_box)
self._brush_style_combo_box = QComboBox()
self._brush_style_combo_box.addItem("Linear Gradient",
Qt.LinearGradientPattern)
self._brush_style_combo_box.addItem("Radial Gradient",
Qt.RadialGradientPattern)
self._brush_style_combo_box.addItem("Conical Gradient",
Qt.ConicalGradientPattern)
self._brush_style_combo_box.addItem("Texture", Qt.TexturePattern)
self._brush_style_combo_box.addItem("Solid", Qt.SolidPattern)
self._brush_style_combo_box.addItem("Horizontal", Qt.HorPattern)
self._brush_style_combo_box.addItem("Vertical", Qt.VerPattern)
self._brush_style_combo_box.addItem("Cross", Qt.CrossPattern)
self._brush_style_combo_box.addItem("Backward Diagonal", Qt.BDiagPattern)
self._brush_style_combo_box.addItem("Forward Diagonal", Qt.FDiagPattern)
self._brush_style_combo_box.addItem("Diagonal Cross", Qt.DiagCrossPattern)
self._brush_style_combo_box.addItem("Dense 1", Qt.Dense1Pattern)
self._brush_style_combo_box.addItem("Dense 2", Qt.Dense2Pattern)
self._brush_style_combo_box.addItem("Dense 3", Qt.Dense3Pattern)
self._brush_style_combo_box.addItem("Dense 4", Qt.Dense4Pattern)
self._brush_style_combo_box.addItem("Dense 5", Qt.Dense5Pattern)
self._brush_style_combo_box.addItem("Dense 6", Qt.Dense6Pattern)
self._brush_style_combo_box.addItem("Dense 7", Qt.Dense7Pattern)
self._brush_style_combo_box.addItem("None", Qt.NoBrush)
brush_style_label = QLabel("&Brush Style:")
brush_style_label.setBuddy(self._brush_style_combo_box)
other_options_label = QLabel("Other Options:")
self._antialiasing_check_box = QCheckBox("&Antialiasing")
self._transformations_check_box = QCheckBox("&Transformations")
self._shape_combo_box.activated.connect(self.shape_changed)
self._pen_width_spin_box.valueChanged.connect(self.pen_changed)
self._pen_style_combo_box.activated.connect(self.pen_changed)
self._pen_cap_combo_box.activated.connect(self.pen_changed)
self._pen_join_combo_box.activated.connect(self.pen_changed)
self._brush_style_combo_box.activated.connect(self.brush_changed)
self._antialiasing_check_box.toggled.connect(self._render_area.set_antialiased)
self._transformations_check_box.toggled.connect(self._render_area.set_transformed)
main_layout = QGridLayout()
main_layout.setColumnStretch(0, 1)
main_layout.setColumnStretch(3, 1)
main_layout.addWidget(self._render_area, 0, 0, 1, 4)
main_layout.setRowMinimumHeight(1, 6)
main_layout.addWidget(shape_label, 2, 1, Qt.AlignRight)
main_layout.addWidget(self._shape_combo_box, 2, 2)
main_layout.addWidget(pen_width_label, 3, 1, Qt.AlignRight)
main_layout.addWidget(self._pen_width_spin_box, 3, 2)
main_layout.addWidget(pen_style_label, 4, 1, Qt.AlignRight)
main_layout.addWidget(self._pen_style_combo_box, 4, 2)
main_layout.addWidget(pen_cap_label, 5, 1, Qt.AlignRight)
main_layout.addWidget(self._pen_cap_combo_box, 5, 2)
main_layout.addWidget(pen_join_label, 6, 1, Qt.AlignRight)
main_layout.addWidget(self._pen_join_combo_box, 6, 2)
main_layout.addWidget(brush_style_label, 7, 1, Qt.AlignRight)
main_layout.addWidget(self._brush_style_combo_box, 7, 2)
main_layout.setRowMinimumHeight(8, 6)
main_layout.addWidget(other_options_label, 9, 1, Qt.AlignRight)
main_layout.addWidget(self._antialiasing_check_box, 9, 2)
main_layout.addWidget(self._transformations_check_box, 10, 2)
self.setLayout(main_layout)
self.shape_changed()
self.pen_changed()
self.brush_changed()
self._antialiasing_check_box.setChecked(True)
self.setWindowTitle("Basic Drawing")
def shape_changed(self):
shape = self._shape_combo_box.itemData(self._shape_combo_box.currentIndex(),
id_role)
self._render_area.set_shape(shape)
def pen_changed(self):
width = self._pen_width_spin_box.value()
style = Qt.PenStyle(self._pen_style_combo_box.itemData(
self._pen_style_combo_box.currentIndex(), id_role))
cap = Qt.PenCapStyle(self._pen_cap_combo_box.itemData(
self._pen_cap_combo_box.currentIndex(), id_role))
join = Qt.PenJoinStyle(self._pen_join_combo_box.itemData(
self._pen_join_combo_box.currentIndex(), id_role))
self._render_area.set_pen(QPen(Qt.blue, width, style, cap, join))
def brush_changed(self):
style = Qt.BrushStyle(self._brush_style_combo_box.itemData(
self._brush_style_combo_box.currentIndex(), id_role))
if style == Qt.LinearGradientPattern:
linear_gradient = QLinearGradient(0, 0, 100, 100)
linear_gradient.setColorAt(0.0, Qt.white)
linear_gradient.setColorAt(0.2, Qt.green)
linear_gradient.setColorAt(1.0, Qt.black)
self._render_area.set_brush(QBrush(linear_gradient))
elif style == Qt.RadialGradientPattern:
radial_gradient = QRadialGradient(50, 50, 50, 70, 70)
radial_gradient.setColorAt(0.0, Qt.white)
radial_gradient.setColorAt(0.2, Qt.green)
radial_gradient.setColorAt(1.0, Qt.black)
self._render_area.set_brush(QBrush(radial_gradient))
elif style == Qt.ConicalGradientPattern:
conical_gradient = QConicalGradient(50, 50, 150)
conical_gradient.setColorAt(0.0, Qt.white)
conical_gradient.setColorAt(0.2, Qt.green)
conical_gradient.setColorAt(1.0, Qt.black)
self._render_area.set_brush(QBrush(conical_gradient))
elif style == Qt.TexturePattern:
self._render_area.set_brush(QBrush(QPixmap(':/images/brick.png')))
else:
self._render_area.set_brush(QBrush(Qt.green, style))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. 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.