使用 QPixmap 创建 QLabel 的一个班轮

Posted

技术标签:

【中文标题】使用 QPixmap 创建 QLabel 的一个班轮【英文标题】:One liner to create QLabel with QPixmap 【发布时间】:2016-02-20 16:16:20 【问题描述】:

使用我当前使用的 QPixmap 创建 QLabel

label = QLabel()
label.setPixmap(QPixmap("path-to-img"))

所以它是 2 行。但我想要一个班轮代码。

我认为下面的代码可能是一个答案。

label = QLabel("<img src=path-toimg></img>")

但我怀疑还有更优雅的方式。

【问题讨论】:

第一个代码有什么问题? @cdonts: 没有问题,除了是 2 行。 QLabel 构造函数不接受pixmap 参数,因此可能没有其他方法。你仍然可以写一行label = QLabel(); label.setPixmap(QPixmap("path-to-img"))。为什么要一个班轮代码? 写一个辅助函数接受一个QPixmap,返回一个QLabel? img 标签单行有效,那你为什么不使用它呢?根据定义,没有优雅的方式来玩代码高尔夫,这就是您的全部问题。 【参考方案1】:

好的,在做一些研究之后你可以做到,但它被认为是非 Pythonic,因为我们滥用了tuple(你可以用listdict 或任何其他可以存储多个值的对象来做到这一点,并且您能够以体面的方式访问这些)。以下代码利用了元组的评估顺序。它不仅可以创建标签并为其分配QPixmap,还可以将其添加到布局中。正如所承诺的全部在一行中。 :D

layout.addWidget((lambda img, lbl: ((lambda i,l: l.setPixmap(i))(img,lbl), (lambda l: l)(lbl)))(QPixmap('../Pictures/IMAGE.jpg'), QLabel('Lambda'))[1])

lambda 在 Python 中的问题在于它的主体中不允许有多个表达式。表达式在这里也是一个关键字——你不能使用语句!然而,我们可以做的是使用一个 lambda 链。上面的代码之所以有效,是因为 lambda 总是返回一个值。

示例和解释为什么这样做:

>>> x = lambda x,y: (x**y, x+y)

返回一个元组。对元组中的每个元素进行评估,以便最终的元组可以由 lambda 表达式返回。这是一个如何工作的示例

>>> x(2,3)
(8,5)

第一个元组元素8 是通过评估x**y 创建的。第二个 - 5 - 是 x+y 的结果。

此外,我们可以引用元组的元素并返回存储在位置 X 的内容。如果我们从上面的数字示例中得到

>>> x(2,3)[0]
8
>>> x(2,3)[1]
5

这正是我们在这里所做的。

外部 lambda (lambda img, lbl: ...)(QPixmap('../Pictures/IMAGE.jpg'), QLabel('Lambda'))[1] - 此 lambda 接收新创建的 QPixmap 以及新创建的QLabel。由于外部 lambda 返回一个元组(见下文),我们可以访问第二个元素(见 第二个内部 lambda第一个内部 lambda (lambda i,l: l.setPixmap(i))(img,lbl) - 我们将像素图和标签对象重定向到它(两者都作为引用传递)并调用 QLabel.setPixmap(...) 方法 第二个内部 lambda (lambda l: l)(lbl) - 这基本上只是重定向 QLabel 对象(已作为参数传递给外部 lambda 并由第一个内部 lambda 设置)以便 - 在访问 @我们返回的元组的 987654341@ 元素实际上得到了一个我们可以使用的对象。

如果您想存储创建的标签,您可以省略layout.addWidget(...),只需将lambda 的结果分配给变量以供进一步使用。如果您使用[0] 作为索引,您将获得None,因为第一个内部lambda 返回None

再次 - 警告! 这是 - 如上所述 - 滥用 Python 的工作方式。正如评论部分所建议的,您应该使用普通的def(命名函数)和return 语句。

【讨论】:

嗯,很复杂……但我明白你的意思。你使用 lambda 就像 lisp 的 (prongn ...)。非常棘手,但毫无疑问,一个班轮。 狡猾,肮脏,而不是pythonic。但是,据我所知,没有其他方法可以在没有额外的 def 函数的情况下在一行中完成所有这些操作,这会增加更多的行。 :D 顺便说一句,这里的非 Python 部分是这样的事实 - 正如我所提到的 - 与 LispHaskell 不同,Python 对函数式编程的支持很糟糕。不要问我为什么,但是该语言的作者不想添加多表达式支持。事实上,甚至有一段时间他想放弃整个 lambda 以支持 Python 3(Python 2.7 中也提供了 lambda;不确定早期版本)。

以上是关于使用 QPixmap 创建 QLabel 的一个班轮的主要内容,如果未能解决你的问题,请参考以下文章

QLabel 上的 QPixmap 无法正确显示

Qt5 QLabel + QPixmap。内存泄漏?

从 QLabel 获取 QPixmap

混淆QLabel和QPixmap

我怎样才能让 QLabel 与它显示的 QPixmap 的大小完全一致?

Qt 之 QPixmap