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

Posted

技术标签:

【中文标题】如何在标签中同时显示图片和文字? (PyQt)【英文标题】:How to show picture and text in the label in the same time? (PyQt) 【发布时间】:2018-10-16 05:50:42 【问题描述】:

我有一个标签 (L1),我想在 L1 中显示图片和文字。然后,我在 L1 中新建一个布局,并在布局中添加一个标签 (L2)。我在 L1 的paintEvent 中绘制文本。 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_())

“你好,世界”被覆盖了。我怎样才能始终显示文本?

【问题讨论】:

how to show picture and text in a label (PyQt)的可能重复 为什么要把一个 QLabel 放在另一个 QLabel 里面?默认小部件不透明,因此子小部件将覆盖父小部件。 在 QLabel 中放置一个 QLabel 后,我可以通过 setgeometry 方法移动里面的 QLabel。因为我已经完成了子类,所以我想找到一种方法来解决这个问题。另外,我考虑了另一种方法,分别在绘图事件中使用 drawImage 和 drawText 在一个 QLabel 中显示文本和图像。 如果您使用布局将 QLabel 放置在另一个 QLabel 中,则使用 setGeometry() 将无济于事,因为位置由布局控制(这是布局任务)您要做什么?在您之前的帖子中,您已经可以同时放置文本和图像。 你是在问XY problem,而不是问你想要什么,请改进你的问题。 【参考方案1】:

我看过一些教程(甚至是 SE 帖子),其中使用 QLabel 作为画布来绘制事物。如果您开始深入研究Qt5 docs,他们建议使用 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_())

有一些随 PyQt5 一起提供的 QGraphicsView 示例,最著名的是“dragdroprobot.py”

【讨论】:

以上是关于如何在标签中同时显示图片和文字? (PyQt)的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 不会在标签中显示图片

如何在 python 中使用 pyqt5 显示 2 个按钮和 2 个标签?

QT中在QLabel中同时显示文字和图片?

PyQt5控制 窗口和显示窗口

关于表格TD中的div 里面图片和<span>中文字如何在一行显示

如何在 PyQt5 中正确显示图片? [关闭]