如何在 QLabel 中使用 QPainter

Posted

技术标签:

【中文标题】如何在 QLabel 中使用 QPainter【英文标题】:How to QPainter inside QLabel 【发布时间】:2017-09-04 19:26:05 【问题描述】:

我不明白如何让 QPainter() 在 QLabel 中绘制,这是我告诉过的代码:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter, QColor, QBrush

class Labella(QLabel):

    def __init__(self, parent):
        super().__init__()

        lb = QLabel('text', parent)
        lb.setStyleSheet('QFrame background-color:grey;')
        lb.resize(200, 200)

        qp = QPainter(lb)
        qp.begin(lb);

        qp.setBrush(QColor(200, 0, 0))
        qp.drawRect(0,0,20,20);
        qp.end();


    def paintEvent(self, e):
        qp = QPainter()
        qp.begin(self)
        self.drawRectangles(qp)
        qp.end()

    def drawRectangles(self, qp):

        col = QColor(0, 0, 0)
        col.setNamedColor('#040404')
        qp.setPen(col)

        qp.setBrush(QColor(200, 0, 0))
        qp.drawRect(10, 15, 200, 60)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        lb = Labella(self)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Colours')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

我只能在 C++ 中找到与 Qt 文档相同的示例,如果没有,请告诉我应该在哪里找到信息。

【问题讨论】:

【参考方案1】:

documentation 建议在paintEvent 中使用QPainter

通过使用如下构造函数,在方法@​​987654324@中,不需要调用begin()end()

(你的Labella类只是错过了一个初始化父级的参数)

save()restore() 方法可以方便地存储 QPainter 的标准配置,允许在恢复设置之前绘制不同的东西。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter, QColor, QBrush

class Labella(QLabel):

    def __init__(self, parent):
        super().__init__(parent=parent)

        self.setStyleSheet('QFrame background-color:grey;')
        self.resize(200, 200)

    def paintEvent(self, e):
        qp = QPainter(self)
        self.drawRectangles(qp)
        qp.setBrush(QColor(200, 0, 0))
        qp.drawRect(0,0,20,20)

    def drawRectangles(self, qp):    
        qp.setBrush(QColor(255, 0, 0, 100))
        qp.save() # save the QPainter config

        qp.drawRect(10, 15, 20, 20)

        qp.setBrush(QColor(0, 0, 255, 100))
        qp.drawRect(50, 15, 20, 20)

        qp.restore() # restore the QPainter config            
        qp.drawRect(100, 15, 20, 20)

class Example(QWidget):

    def __init__(self):
        super().__init__()

        lb = Labella(self)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Colours')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

【讨论】:

谢谢,但是不能让 setText() 与这个设置一起工作吗?当 Painter 打开时,标签中似乎没有文本出现 @user3755529 你说得对,对不起,我首先没有理解你问题的这一部分,我正在研究这个来解释这种行为。你的主要目标是什么,重新绘制标签的背景? 我在 QLabel 中有一个 html 表格子集(在 QVBoxLayout 中会有很多这样的标签要布局)。在表格下,我想添加一个画布,我将在其中绘制一个条形图,指示我们在 QLabel 识别的金融工具的 52 周价格范围内所处的位置。

以上是关于如何在 QLabel 中使用 QPainter的主要内容,如果未能解决你的问题,请参考以下文章

使用 QPainter 和 paintEvent 在 PYQT5 中的 QLabel 中包含的 Pixmap 上绘制圆圈

QLabel 上的 QPixmap 无法正确显示

聊天气泡的绘制(圆角矩形+三角形+黑色边框,关键学会QPainter的draw函数就行了),注意每个QLabel都有自己的独立坐标

QT 实现在QLabel上画图

9.3.1 QPainter相关函数介绍

Qt:在 Widget 内设置 QLabel 坐标