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

#!/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())