Zeichnen mit PyQt4
Zeichnen wird für die Veränderung und Erweiterung eines bestehenden Widgets oder bei der Erstellung eines bedarsangepassten, vollständig neu erzeugten Widgets verwendet. Zum Zeichnen nutzen wir die Zeichen-API, das das PyQt4-Toolkit mitbringt.
Das Zeichnen wird mittels der paintEvent()-Methode vollzogen. Der Zeichnen-Code wird zwischen der begin()- und end()-Methode des QPainter-Objekts platziert.
Das Zeichnen von Text
Wir beginnen damit Unicode-Text in den Bereich des Fensters zu zeichnen.
#!/usr/bin/python
# drawtext.py
import sys
from PyQt4 import QtGui, QtCore
class DrawText(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Draw Text')
self.text = u'\u041b\u0435\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\
\u0435\u0432\u0438\u0447 \u0422\u043e\u043b\u0441\u0442\u043e\u0439: \n\
\u0410\u043d\u043d\u0430 \u041a\u0430\u0440\u0435\u043d\u0438\u043d\u0430'
def paintEvent(self, event):
paint = QtGui.QPainter()
paint.begin(self)
paint.setPen(QtGui.QColor(168, 34, 3))
paint.setFont(QtGui.QFont('Decorative', 10))
paint.drawText(event.rect(), QtCore.Qt.AlignCenter, self.text)
paint.end()
app = QtGui.QApplication(sys.argv)
dt = DrawText()
dt.show()
app.exec_()
In unserem Beispiel zeichnen wir etwas Text in Azbuka. Der Text wird senkrecht und waagerecht ausgerichtet.
def paintEvent(self, event):
Das Zeichnen selbst wird mit dem paintEvent() vollzogen.
paint = QtGui.QPainter() paint.begin(self) ... paint.end()
Die QPainter-Klasse ist für alles niedrigschwellige Malen verantwortlich. Alle Malmethoden liegen zwischen begin()- und end()-Methode.
paint.setPen(QtGui.QColor(168, 34, 3))
paint.setFont(QtGui.QFont('Decorative', 10))
Hier definieren wir Stift und Schrifttyp, die wir zum Zeichen des Textes verwenden.
paint.drawText(event.rect(), QtCore.Qt.AlignCenter, self.text)
Die drawText()-Methode zeichnet den Text in das Fenster.
Abbildung: Das Zeichnen von Text
Punkte zeichnen
Ein Punkt ist das einfachste grafische Objekt, das man zeichnen kann. Es ist ein kleiner Punkt auf dem Fenster.
#!/usr/bin/python
# points.py
import sys, random
from PyQt4 import QtGui, QtCore
class Points(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Points')
def paintEvent(self, event):
paint = QtGui.QPainter()
paint.begin(self)
paint.setPen(QtCore.Qt.red)
size = self.size()
for i in range(1000):
x = random.randint(1, size.width()-1)
y = random.randint(1, size.height()-1)
paint.drawPoint(x, y)
paint.end()
app = QtGui.QApplication(sys.argv)
dt = Points()
dt.show()
app.exec_()
In unserem Beispiel zeichnen wir 1000 zufällig auf der Fläche verteilte rote Punkte.
paint.setPen(QtCore.Qt.red)
Wir belegen den Stift mit roter Farbe, in diesem Fall durch Verwendung einer vordefinierten Farbkonstanten (Qt.red).
size = self.size()
Bei jeder Größenänderung am Fenster wird ein paint-Ereignis ausgelöst. Die aktuelle Größe eines Fensters erfragen wir mit der size()-Methode.
paint.drawPoint(x, y)
Wir zeichnen den Punkt mit der drawPoint()-Methode.
Abbildung: Punkte
Farben
Eine Farbe ist ein Objekt, das eine Kombination aus Rot-, Grün- und Blauintensitätswerten repräsentiert. Zulässige RGB-Werte liegen zwischen 0 und 255. Wir können eine Farbe auf verschiedene Weisen definieren. Die verbreitetsten sind RGB-Dezimalwerte oder -Hexadezimalwerte. Genauso lässt sich ein RGBA-Wert eingesetzt werden, das steht für Rot, Grün, Blau und Alpha, wodurch wir zusätzliche Information zur Transparenz hinzufügen können. Ein Alphawert von 255 steht für volle Farbe, 0 steht für vollständige Transparenz, d.h. die Farbe ist nicht sichtbar.
#!/usr/bin/python
# colors.py
import sys, random
from PyQt4 import QtGui, QtCore
class Colors(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 350, 280)
self.setWindowTitle('Colors')
def paintEvent(self, event):
paint = QtGui.QPainter()
paint.begin(self)
color = QtGui.QColor(0, 0, 0)
color.setNamedColor('#d4d4d4')
paint.setPen(color)
paint.setBrush(QtGui.QColor(255, 0, 0, 80))
paint.drawRect(10, 15, 90, 60)
paint.setBrush(QtGui.QColor(255, 0, 0, 160))
paint.drawRect(130, 15, 90, 60)
paint.setBrush(QtGui.QColor(255, 0, 0, 255))
paint.drawRect(250, 15, 90, 60)
paint.setBrush(QtGui.QColor(10, 163, 2, 55))
paint.drawRect(10, 105, 90, 60)
paint.setBrush(QtGui.QColor(160, 100, 0, 255))
paint.drawRect(130, 105, 90, 60)
paint.setBrush(QtGui.QColor(60, 100, 60, 255))
paint.drawRect(250, 105, 90, 60)
paint.setBrush(QtGui.QColor(50, 50, 50, 255))
paint.drawRect(10, 195, 90, 60)
paint.setBrush(QtGui.QColor(50, 150, 50, 255))
paint.drawRect(130, 195, 90, 60)
paint.setBrush(QtGui.QColor(223, 135, 19, 255))
paint.drawRect(250, 195, 90, 60)
paint.end()
app = QtGui.QApplication(sys.argv)
dt = Colors()
dt.show()
app.exec_()
In unserem Beispiel zeichnen wir 9 farbige Rechtecke. Die erste Reihe zeigt rote Farbe in unterschiedlichen Alphaabstufungen.
color = QtGui.QColor(0, 0, 0)
color.setNamedColor('#d4d4d4')
Hier definieren wir eine Farbe in Hexadezimal-Schreibweise.
paint.setBrush(QtGui.QColor(255, 0, 0, 80)); paint.drawRect(10, 15, 90, 60)
Hier definieren wir einen Pinsel und zeichnen ein Rechteck. Ein Pinsel ist ein elementares Grafikobjekt, um den Hintergrund einer Figur zu zeichnen. Die drawRect()-Methode empfängt vier Parameter. Die ersten zwei sind x- und y-Werte. Der dritte und vierte Parameter sind Breite und Höhe des Rechtecks. Die Methode zeichnet ein Rechteck unter Verwendung des eingestellten Stifts und des eingestellten Pinsels.
Abbildung: Farben
QPen
QPen ist ein grundlegendes Grafikobjekt. Es wird zum Zeichnen von Linien, Kurven und Umrandungen eines Rechtecks, Ellipsen, Polygonen oder anderen Formen verwendet.
#!/usr/bin/python
# penstyles.py
import sys
from PyQt4 import QtGui, QtCore
class PenStyles(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 280, 270)
self.setWindowTitle('penstyles')
def paintEvent(self, event):
paint = QtGui.QPainter()
paint.begin(self)
pen = QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine)
paint.setPen(pen)
paint.drawLine(20, 40, 250, 40)
pen.setStyle(QtCore.Qt.DashLine)
paint.setPen(pen)
paint.drawLine(20, 80, 250, 80)
pen.setStyle(QtCore.Qt.DashDotLine)
paint.setPen(pen)
paint.drawLine(20, 120, 250, 120)
pen.setStyle(QtCore.Qt.DotLine)
paint.setPen(pen)
paint.drawLine(20, 160, 250, 160)
pen.setStyle(QtCore.Qt.DashDotDotLine)
paint.setPen(pen)
paint.drawLine(20, 200, 250, 200)
pen.setStyle(QtCore.Qt.CustomDashLine)
pen.setDashPattern([1, 4, 5, 4])
paint.setPen(pen)
paint.drawLine(20, 240, 250, 240)
paint.end()
app = QtGui.QApplication(sys.argv)
dt = PenStyles()
dt.show()
app.exec_()
In unserem Beispiel zeichnen wir sechs Linien. Die Linien werden in sechs unterschiedlichen Stiftstilen nachgezogen. Es gibt fünf vordefinierte Stiftstile. Darüber hinaus können wir benutzerdefinierte Stile erstellen. Mit einem solchen wird die letzte Linie gezeichnet.
pen = QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine)
Wir erzeugen ein QPen-Objekt in schwarzer Farbe. Die Breite wird auf zwei Pixel gesetzt, sodass wir sehen den Unterschied zwischen den Stiftstilen sehen können. Die QtCore.Qt.SolidLine ist einer der vordefinierten Stile.
pen.setStyle(QtCore.Qt.CustomDashLine) pen.setDashPattern([1, 4, 5, 4]) paint.setPen(pen)
Hier bestimmen wir einen benutzerdefinierten Stiftstil. Wir wählen einen QtCore.QtCustomDashLine-Stiftstil und erzeugen mit der setDashPattern()-Methode eine gestrichelte Linie. Die Ziffernliste definiert einen Stil. Es muss eine gerade Anzahl an Ziffern sein. Ungerade Ziffern definieren einen Strich, gerade Ziffern eine die Größe der Lücken. Je größer die Ziffern, desto größer Abstand oder Linie. Unser Muster ist 1px Strich, 4px Lücke, 5px Strich und 4px Lücke etc.
Abbildung: Stiftstile
QBrush
QBrush ist ein grundlegendes Grafikobjekt. Es wird zum Malen des Hintergrundes von Figuren wie Rechtecke, Ellipsen oder Polygone verwendet. Es gibt drei Pinseltypen: Vordefinierte Pinsel, Verläufe oder Texturmuster.
#!/usr/bin/python
# brushes.py
import sys
from PyQt4 import QtGui, QtCore
class Brushes(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 355, 280)
self.setWindowTitle('Brushes')
def paintEvent(self, event):
paint = QtGui.QPainter()
paint.begin(self)
brush = QtGui.QBrush(QtCore.Qt.SolidPattern)
paint.setBrush(brush)
paint.drawRect(10, 15, 90, 60)
brush.setStyle(QtCore.Qt.Dense1Pattern)
paint.setBrush(brush)
paint.drawRect(130, 15, 90, 60)
brush.setStyle(QtCore.Qt.Dense2Pattern)
paint.setBrush(brush)
paint.drawRect(250, 15, 90, 60)
brush.setStyle(QtCore.Qt.Dense3Pattern)
paint.setBrush(brush)
paint.drawRect(10, 105, 90, 60)
brush.setStyle(QtCore.Qt.DiagCrossPattern)
paint.setBrush(brush)
paint.drawRect(10, 105, 90, 60)
brush.setStyle(QtCore.Qt.Dense5Pattern)
paint.setBrush(brush)
paint.drawRect(130, 105, 90, 60)
brush.setStyle(QtCore.Qt.Dense6Pattern)
paint.setBrush(brush)
paint.drawRect(250, 105, 90, 60)
brush.setStyle(QtCore.Qt.HorPattern)
paint.setBrush(brush)
paint.drawRect(10, 195, 90, 60)
brush.setStyle(QtCore.Qt.VerPattern)
paint.setBrush(brush)
paint.drawRect(130, 195, 90, 60)
brush.setStyle(QtCore.Qt.BDiagPattern)
paint.setBrush(brush)
paint.drawRect(250, 195, 90, 60)
paint.end()
app = QtGui.QApplication(sys.argv)
dt = Brushes()
dt.show()
app.exec_()
In unserem Beispiel zeichen wir sechs verschiedene Rechtecke.
brush = QtGui.QBrush(QtCore.Qt.SolidPattern) paint.setBrush(brush) paint.drawRect(10, 15, 90, 60)
Wir definieren ein Pinselobjekt, übergeben es dem paint-Objekt und zeichnen ein Rechteck durch Aufruf der drawRect()-Methode.
Abbildung: Pinsel