【问题标题】:clip the text with a circular region用圆形区域剪辑文本
【发布时间】:2019-05-27 12:45:48
【问题描述】:

如何制作内含文字的透明椭圆或用文字替换椭圆边框?

用边框替换文本

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)

椭圆内的文字

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')

【问题讨论】:

  • 你可以展示一张你想要得到的图片。
  • 你可以解释你想要什么,除了什么是自我?。图片和你想要的有什么关系?
  • GIMP ;) 照片编辑器
  • self 就是 QMainWindow 就是这样。
  • 你的评论不清楚,解释并回答我的问题:-)

标签: python python-3.x pyqt pyqt5 qpainter


【解决方案1】:

你必须使用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_())

【讨论】:

  • 不管怎样,setOpacity 在循环中是否存在像setOpacity(round(random.random(), 2)) 这样的随机值。我收到错误 Painter not active
  • @KrishnaTorque 您指出的错误是当您尝试在没有设置设备的情况下在 QPainter 中使用它或者您在paintEvent 之外使用 QPainter 时引起的,这不是由于不透明度
猜你喜欢
  • 2011-08-04
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2018-11-09
相关资源
最近更新 更多