【问题标题】:Pyqt: How do I erase a text drawn at paintEvent?Pyqt:如何擦除在paintEvent 中绘制的文本?
【发布时间】:2018-01-03 13:01:52
【问题描述】:

我创建了一个继承 QWidget 的 Roatatable Text 类,它工作正常。 但是当我试图用 label.destroy(), 它没有消失。

我尝试使用QPainter.eraseRect(),将painter 更改为self.painter 和 执行label.painter.eraseRect()。 但我失败了。

代码如下:

class RotatedText(QtWidgets.QWidget):
    def __init__(self, x, y, angle, text, color):
        QtWidgets.QWidget.__init__(self)
        # Setting variables...
        self.setGeometry(0, 0, 1920, 1080)
        # I did this because texts ain't showing if they're too far away from (0, 0)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.translate(self.x, self.y)
        painter.rotate(self.angle)
        painter.setPen(QtGui.QPen(QtGui.QColor(self.color_r, self.color_g, self.color_b)))
        painter.setFont(QtGui.QFont("나눔고딕", 20))
        painter.drawText(0, 0, self.text)
        painter.end()

class MainWindow(QtWidgets.QDialog):
    def __init__(self, parent=None):
        label = RotatedText(50, 50, 45, "hi", (0, 0, 0))
        label.setParent(self)
        label.show()

(删掉其他与此无关的代码)

drawText() 绘制的文本在一个小部件上,所以我认为销毁小部件也可以删除文本...... 如何删除它?

用继承QLabel的新类替换这个类就可以了。它会更容易使用,但我没有成功,所以我正在使用这个类。

附言只擦除所有​​已绘制的内容对我来说不是合适的解决方案,因为有很多文本,我只想擦除一个。

【问题讨论】:

  • 请解释清楚,有很多文本是什么意思?你能用一张图片来说明这个问题吗?
  • 我的意思是我通过有很多文本创建了很多这个类的实例。因此,擦除使用 QPainter 制作的所有内容是不合适的。 (抱歉解释不佳,我的母语不是英语)
  • 你为什么不设置self.text = ""并调用update()再次绘制一个空文本?
  • 哦,成功了!非常感谢!不知道有更新功能
  • update() 内部调用paintEvent() :P

标签: python pyqt pyqt5 qwidget qpainter


【解决方案1】:

设置self.text = "" 并致电update() 工作。 非常感谢 eyllanesc!

  • 我在其他小部件上尝试了destroy(),但它似乎没有被“破坏”。相反,deleteLater() 起作用了。它也适用于我制作的小部件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 2013-03-15
    • 2013-02-15
    • 1970-01-01
    • 2020-07-27
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多