как показать картинку и текст на этикетке (PyQt) - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно показать изображение и текст на этикетке, а это мой код:

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, чтобы решить эту проблему.

Однако у меня есть еще два вопроса.

Я обнаружил, что если я отображаю изображение и текст в paintEvent из MyLable, лайки:

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)

Текст отображался поверх изображения, даже если я сначала отображаю текст, а затем отображаю изображение. Почему?

Во-вторых, когда я отображаю изображение и текст в paintEvent MyLabel без супер (MyLabel, self) .paintEvent (QPaintEvent), я обнаружил, что отображается только текст, а изображение отсутствует:

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 голосов
/ 02 мая 2018

Перезаписав метод 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 по причинам оптимизации обновляет изображение, только если оно отличается, поскольку оно использует cacheKey() из QPixmap, поэтому рисуем только при необходимости.

В вашем первом случае, когда он отображается в первый раз, текст закрашивается, затем вы устанавливаете QPixmap, и поскольку QPixmap не перерисовывается при первом вызове paintEvent(), он снова рисует текст, затем вы снова устанавливаете QPixmap, но, как и предыдущий, я не рисую его, а рисую тот, который сохранен в кеше, поэтому в следующий раз, когда вызывается paintEvent(), он только рисует текст на исходное изображение кеша.

Во втором случае, если не использовать paintEvent() родительского элемента, кэш не используется, поэтому QPixmap не будет отображаться, и в этом случае будет отображаться только текст.

Примечание : не рекомендуется выполнять задачу, отличную от рисования в методе paintEvent(), вы можете вызвать такие проблемы, как бесконечный цикл.

...