lang/pysideex/ QPaintingTextExamples1


Draw Hello World in random colour at random coords

#!/usr/bin/env python3
import random

from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *
import sys

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.w, self.h = 680, 480
        self.setFixedSize(self.w,self.h)
        self.pixmap = QPixmap(self.size())
        self.pixmap.fill(Qt.white)

        self.painter = QPainter()
        self.text = "Hello World!"

    def paintEvent(self, event: QPaintEvent):
        with QPainter(self) as painter:
            painter.drawPixmap(0, 0, self.pixmap)

    def mousePressEvent(self, event: QMouseEvent):
        self.drawSomeText()

    def drawSomeText(self):
        x0 = random.randrange(0,self.w-100)
        y0 = random.randrange(0,self.h-100)

        r,g,b,a = [random.randrange(0,256) for i in range(4)]
        self.penColor = QColor(r,g,b)
        r,g,b,a = [random.randrange(0,256) for i in range(4)]
        self.brushColor = QColor(r,g,b,a)

        self.painter.begin(self.pixmap)
        self.painter.setRenderHints(QPainter.Antialiasing, True)

        # paint here
        p = self.painter
        f = p.font()
        f.setPixelSize(64)
        p.setFont(f)
        p.setPen(self.penColor)
        p.drawText(x0,y0,self.text)


        self.painter.end()
        self.update()

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)

        self.widget = MyWidget()
        self.setCentralWidget(self.widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = MainWindow()
    w.show()
    sys.exit(app.exec())

p2: Use Font Metrics to Draw Multicoloured Text

p2 example

#!/usr/bin/env python3
import random

from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *
import sys

class Wrap:
  def __init__(self,*xs,**kw):
    self.l = list(*xs,**kw)
  def __getitem__(self,i):
    return self.l[i%len(self.l)]

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.w, self.h = 680, 480
        self.setFixedSize(self.w,self.h)
        self.pixmap = QPixmap(self.size())
        self.pixmap.fill(Qt.white)

        self.painter = QPainter()

        # self.font = self.painter.font()
        self.font = QFont("Bitstream Charter",40)
        self.text = "Hello World!"
        self.letters = Wrap(self.text)
        self.i = 0
        self.n = 0
        self.linelength = 20 
        self.x0 = 10
        self.x = self.x0
        self.y0 = 10
        self.y = self.y0
        self.lsep = 5
        s = QFontMetrics(self.font).size(Qt.TextSingleLine, "Xy")
        self.lh = s.height() + self.lsep
        self.y += self.lh

    def paintEvent(self, event: QPaintEvent):
        with QPainter(self) as painter:
            painter.drawPixmap(0, 0, self.pixmap)

    def mousePressEvent(self, event: QMouseEvent):
        self.drawSomeText()

    def drawSomeText(self):

        r,g,b,a = [random.randrange(0,256) for i in range(4)]
        self.penColor = QColor(r,g,b)

        self.painter.begin(self.pixmap)
        self.painter.setRenderHints(QPainter.Antialiasing, True)

        # paint here
        p = self.painter
        p.setPen(self.penColor)
        p.setFont(self.font)
        letter = self.letters[self.i]
        p.drawText(self.x,self.y,letter)
        s = QFontMetrics(self.font).size(Qt.TextSingleLine, letter)
        w = s.width()
        self.x += w

        self.i += 1
        self.n += 1
        if self.n >= self.linelength:
          self.n = 0
          self.x = self.x0
          self.y += self.lh

        self.painter.end()
        self.update()

"""
QPainter painter(this);
painter.setPen(Qt::yellow);
painter.drawText(0, 20, "One");
painter.setPen(Qt::red);
painter.drawText(QFontMetrics(painter.font()).size(Qt::TextSingleLine, "One ").width(), 20, "Two");
"""

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)

        self.widget = MyWidget()
        self.setCentralWidget(self.widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = MainWindow()
    w.show()
    sys.exit(app.exec())