【问题标题】:how to set the background color for draw text?如何设置绘制文本的背景颜色?
【发布时间】:2019-11-26 11:27:40
【问题描述】:

我要设置文本的背景,也就是说我要设置包含文本的矩形的颜色。我已经测试了 QPainter.setBackground,但它不起作用。这是我的代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MyLabel(QLabel):
    def __init__(self):
        super(MyLabel, self).__init__()
        self.setMinimumHeight(200)
        self.setMinimumWidth(200)

    def paintEvent(self, QPaintEvent):
        super(MyLabel, self).paintEvent(QPaintEvent)
        pos = QPoint(50, 50)
        painter = QPainter(self)

        brush = QBrush()
        brush.setColor(QColor(255,0,0))

        painter.setBackgroundMode(Qt.OpaqueMode)
        painter.setBackground(brush)

        painter.drawText(pos, 'hello,world')

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QHBoxLayout(self)
        self.label = MyLabel()
        layout.addWidget(self.label)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

我想要的是:

感谢您的帮助。

【问题讨论】:

    标签: python pyqt pyqt5 qlabel


    【解决方案1】:

    不需要实现个性化的QLabel,通过Qt Style Sheet设置背景色就足够了,如果要建立某个位置也不要使用布局

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Window(QtWidgets.QWidget):
        def __init__(self):
            super(Window, self).__init__()
    
            self.label = QtWidgets.QLabel("hello,world", self)
            self.label.adjustSize()
            self.label.setStyleSheet(
                "background-color: {};".format(QtGui.QColor(255, 0, 0).name())
            )
            self.label.move(QtCore.QPoint(50, 50))
    
    if __name__ == "__main__":
    
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.resize(640, 480)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 只是好奇为什么不把window.resize()调用放在Window的初始化例程中作为self.resize()?除非绝对有必要,否则保持一个类的所有元素自包含不是更好吗?另外,如果您什么都不做,为什么还要包含 sys.argv?
    • @DennisJensen 这是品味问题,所以在里面或外面并不违反任何设计原则。
    • @DennisJensen 您可以传递 sys.argv 或 list() 或 [],遵循相同的原则,另一方面,我有使用 sys.argv 的坏/好习惯,因为有时我想传递其他标志,例如在 Qt WebEngine 中允许我启用远程调试,或者我也可以指向样式或 qss 而无需修改代码
    • 嗯,在我上次查看时,将事物封装在自身内部是一种很好的设计原则;)至于 sys.argv 实现您出于任何原因不会在函数中使用的东西是不好的习惯实际上是因为它只会增加不必要的复杂性,这可能会导致混乱——就像现在他为什么要包含它一样,他似乎没有使用它,但也许我错了,我只是没有找到他在哪里使用它—— - 那种东西
    • 注意我只提到这一点是因为人们经常来到这里,然后采用提供答案的人的习惯(好或坏),如果我分享对他们有不好元素的答案,这对我来说似乎是一种伤害一个人知道最好不要做那种事情
    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多