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

У меня есть метка (L1), и я хочу показать изображение и текст в L1. Затем я создаю макет в L1 и добавляю метку (L2) в макет. Я рисую текст в paintEvent of L1. L2 можно перемещать, а L2 что-то будет покрывать текст. Демо-версия:

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

class MyLabel(QLabel):
    def __init__(self):
        super(MyLabel, self).__init__()
        layout = QHBoxLayout()
        self.setLayout(layout)
        label = QLabel('test')
        label.setStyleSheet("background-color: rgb(255,255,255)")
        layout.addWidget(label)


    def paintEvent(self, QPaintEvent):
        super(MyLabel, self).paintEvent(QPaintEvent)
        pos = QPoint(50, 50)
        painter = QPainter(self)
        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_())

Привет, мир! Как я могу всегда отображать текст?

1 Ответ

0 голосов
/ 09 мая 2018

Я видел несколько уроков (и даже постов SE), где QLabel используется как холст для рисования вещей. Если вы начнете копаться в документах Qt5 , они предполагают, что использование системы QGraphicsView / QGraphicsScene - это хороший способ рисовать на холсте. Я не буду лгать: есть некоторые издержки, чтобы выяснить, как использовать все вместе, но система довольно мощная, и вы можете сделать красивую графику таким образом из всех видов примитивов.

Если вам нужно что-то маленькое и простое, использование QLabel и PaintEvent неплохо. Но если в вашем приложении много графики, я бы порекомендовал QGraphicsView.

Вот простой пример рисования двух фрагментов текста в QGraphicsView. Во-первых, мы не устанавливаем позицию, поэтому по умолчанию (0,0) верхний левый угол. Вторая рисуется в (50,50)

from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget,
                             QGraphicsView, QGraphicsScene, 
                             QGraphicsSimpleTextItem, QGridLayout)

import sys

class DemoApp(QMainWindow):
    def __init__(self, parent=None):

        super(DemoApp, self).__init__()

        # set up the layout for the MainWindow. 
        grid_layout = QGridLayout()
        self.graphicsView = QGraphicsView()
        grid_layout.addWidget(self.graphicsView)

        widget = QWidget()
        widget.setLayout(grid_layout)

        self.setCentralWidget(widget)

        scene = QGraphicsScene()
        self.graphicsView.setScene(scene)

        mytext1 = QGraphicsSimpleTextItem('the first label')
        scene.addItem(mytext1)

        mytext2 = QGraphicsSimpleTextItem('the second label')
        scene.addItem(mytext2)
        mytext2.setPos(50,50)

app = QApplication(sys.argv)
demo_app = DemoApp(None)

demo_app.show()

sys.exit(app.exec_())

Есть несколько примеров для QGraphicsView, которые поставляются с PyQt5, в частности, «dragdroprobot.py»

...