如何修复 PySide2 QPixmapCache.find() 的 DeprecationWarning?

3

我目前正在将一个大型应用从Py2/PySide 1.2.4迁移到Py3/PySide2 5.13.0,并发现一个关于使用QPixmapCache.find(key, pixmap)的DeprecationWarning。

c:\path\to\module.py:220: DeprecationWarning: QPixmapCache.find(const QString & key, QPixmap & pixmap) is deprecated
  if (QPixmapCache.find("image_key", pixmap) is False):

我想解决这个不再被支持的警告,但是文档并没有提供很有用的信息,因为它:
  • 实际上在一个地方明确推荐使用不再被支持的函数。(PySide2.QtGui.QPixmapCache.find(key)
  • 有两个关于 static PySide2.QtGui.QPixmapCache.find(key, pixmap) 的条目
    • 其中一个被标记为已不再支持。
    • 另一个则没有。
  • 似乎没有提供关于现代用法的建议。(或者我没有找到)
那么,对于不再支持的使用方式PySide2.QtGui.QPixmapCache.find(key, pixmap),建议采取什么措施呢?
3个回答

1

建议的修复方法是避免将一个 pixmap 作为第二个参数传递给 find,因为它并不是真正需要的(见下文)。因此,你的代码应该简单地更改为:

pixmap = QPixmapCache.find("image_key")
if pixmap is None:
    ...

在PySide2中,包含需要传入第二个参数的方法似乎是一个bug(或者说是不正确的特性)。它可能只应该实现这两个重载方法:
- find(str) -> QPixmap - find(QPixmapCache.Key) -> QPixmap 其他方法更加针对于C++,目前定义如下:
- find(const QString &key, QPixmap *pixmap) -> bool - find(const QPixmapCache::Key &key, QPixmap *pixmap) -> bool
这里的第二个参数是一个指针,Qt会将找到的像素图设置为它。在C++中必须这样做,因为无法返回(bool, QPixmap)元组,就像Python中可能做的那样。同样地,使用PySide实现这些方法似乎没有多大意义,因为Python中没有指针。(我猜测废弃的方法在传入的参数上使用了类似于QPixmap.swap的东西来获得类似的行为)。
当前API/文档中的混淆应该报告给PySide bug tracker。作为参考,PyQt5只实现了上面显示的前两种方法,这似乎是最Pythonic的方法。很难想象为什么还应该包含任何其他重载(除了向后兼容性)。

1
正如@ekhumoro所指出的那样,这似乎是一个bug,但是目前使用QPixmapCache::Key的以下方法可以正常工作:
from PySide2 import QtGui

if __name__ == '__main__':
    import sys

    app = QtGui.QGuiApplication(sys.argv)

    filename = "test.png"

    key = QtGui.QPixmapCache.Key()
    pm  = QtGui.QPixmap()

    for i in range(100):
        pix = QtGui.QPixmapCache.find(key)
        if pix is None:
            pm.load(filename)
            key = QtGui.QPixmapCache.insert(pm)
            print("load from filename")
        else:
            pm = pix

输出:

load from filename

0

实际上,单参数版本的PySide2.QtGui.QPixmapCache.find(key)也会引发DeprecationWarning警告。最终,我按照@eyllanesc提出的方式进行了修复,但在我的情况下略微不便,因为我事先从散列数据生成了密钥。我点赞了两个答案,并接受了@eyllanesc的答案。谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接