如何在标签中显示图片和文字(PyQt)

时间:2018-05-02 14:43:19

标签: python pyqt pyqt5 qlabel

我需要在标签中显示图片和文字,这是我的代码:

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

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

    def paintEvent(self, QPaintEvent):
        pos = QPoint(50, 50)
        painter = QPainter(self)
        painter.drawText(pos, 'hello,world')
        painter.setPen(QColor(255, 255, 255))

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QHBoxLayout(self)
        self.label = MyLabel()
        self.pixmap = QPixmap('icon.png')
        self.label.setPixmap(self.pixmap)

        layout.addWidget(self.label)


if __name__ == '__main__':

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

标签仅显示文字,图片丢失。 如何在标签中显示图像和文本。

感谢eyllanesc解决这个问题。

但是,我还有两个问题。

我发现如果我在myLable的paintEvent中显示图像和文本,请点击:

def paintEvent(self, QPaintEvent):
    super(MyLabel, self).paintEvent(QPaintEvent)

    pos = QPoint(50, 50)
    painter = QPainter(self)
    painter.drawText(pos, 'hello,world')
    painter.setPen(QColor(255, 255, 255))

    self.pixmap = QPixmap('C:\\Users\\zhq\\Desktop\\DicomTool\\icon.png')
    self.setPixmap(self.pixmap)

即使我首先显示文本然后显示图像,文本仍显示在图像上。为什么呢?

其次,当我在没有super(MyLabel,self).paintEvent(QPaintEvent)的myLabel的paintEvent中显示图像和文本时,我发现只显示了文本,并且图片丢失了:

def paintEvent(self, QPaintEvent):
    pos = QPoint(50, 50)
    painter = QPainter(self)
    painter.drawText(pos, 'hello,world')
    painter.setPen(QColor(255, 255, 255))

    self.pixmap = QPixmap('C:\\Users\\zhq\\Desktop\\DicomTool\\icon.png')
    self.setPixmap(self.pixmap)

1 个答案:

答案 0 :(得分:3)

覆盖paintEvent方法,您已删除了显示QPixmap的行为,因此图片不可见。您应该做的是首先执行paintEvent QLabel方法总是做的事情然后只绘制文本。

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

    def paintEvent(self, event):
        super(MyLabel, self).paintEvent(event)
        pos = QPoint(50, 50)
        painter = QPainter(self)
        painter.drawText(pos, 'hello,world')
        painter.setPen(QColor(255, 255, 255))

QLabel出于优化的原因,只有在图片使用QPixmap的{​​{3}}时才会更新图片,因此只在必要时进行绘制。

在您第一次显示第一个案例时,文字会被绘制,然后您设置QPixmap,因为第一次调用QPixmap时没有重新绘制paintEvent(),它再次绘制文本,然后再次设置QPixmap但是与前一个相同,我不绘制它但绘制保存在缓存中的那个,所以在以下时间{{1调用它时,它只在缓存的初始图像上绘制文本。

在第二种情况下,如果不使用父项的paintEvent(),则不使用缓存,因此不会绘制paintEvent(),在这种情况下只会绘制文本。

注意 :除了绘制QPixmap方法之外,不建议执行任务,否则可能导致无限循环等问题