如何在标签中同时显示图片和文字? (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)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中使用 pyqt5 显示 2 个按钮和 2 个标签?