Search code examples
pythonpython-3.xpyqtpyqt5qpainter

clip the text with a circular region


How to Make Transparent ellipse with text inside or replace the ellipse border with text?

Replace Text with Border

ellipse = QPainter(self)
ellipse.setOpacity(0.6)
ellipse.setPen(QtGui.QPen(Qt.darkGreen, 4, Qt.DashLine))    # Any way to replace 'DashLine with Text ?'
ellipse.setBrush(QBrush(QColor(self.window_bg), Qt.SolidPattern))
ellipse.drawEllipse(0, 0, self.ellipse_width, self.ellipse_height)

Text inside Ellipse

ellipse = QPainter(self)
ellipse.setOpacity(0.6)
ellipse.setBrush(QBrush(QColor('#000000'), Qt.SolidPattern))
ellipse.drawEllipse(0, 0, 300, 300)
ellipse.drawText(10, 10, 'Random Text')

enter image description here


Solution

  • You have to use a setClipPath():

    import random
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class MainWindow(QtWidgets.QMainWindow):
        def paintEvent(self, event):
            window_bg = "#0011ff"
            ellipse_width, ellipse_height = self.width(), self.height()
            r = QtCore.QRectF(0, 0, ellipse_width, ellipse_height)
            text = "Stack OverFlow :-)"
    
            path = QtGui.QPainterPath()
            path.addEllipse(r)
    
            painter = QtGui.QPainter(self)
            painter.setRenderHint(QtGui.QPainter.Antialiasing)
            painter.setClipPath(path, QtCore.Qt.IntersectClip)
            painter.setOpacity(0.6)
            painter.setBrush(QtGui.QBrush(QtGui.QColor('#000000'), QtCore.Qt.SolidPattern))
            painter.setPen(QtGui.QPen(QtCore.Qt.darkGreen, 4, QtCore.Qt.DashLine))    
            painter.setBrush(QtGui.QBrush(QtGui.QColor(window_bg), QtCore.Qt.SolidPattern))
            painter.drawEllipse(r)
    
            # draw text in random positions
            for i in range(100):
                x = random.randint(0, self.width())
                y = random.randint(0, self.height())
                painter.drawText(x, y, text)
    
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.resize(640, 480)
        w.show()
        sys.exit(app.exec_())
    

    enter image description here