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

时间:2019-08-13 20:02:22

标签: python python-3.x pyside2 deprecation-warning qpixmapcache

我目前正在将大型应用程序从Py2 / PySide 1.2.4移植到Py3 / PySide2 5.13.0,并且发现与DeprecationWarning的使用有关的QPixmapCache.find(key, pixmap)

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

我想修复此弃用警告,但是documentation并不是很有帮助:

    实际上,在一个地方明确建议使用不推荐使用的功能。 (PySide2.QtGui.QPixmapCache.find(key)
  • 对于static PySide2.QtGui.QPixmapCache.find(key, pixmap)有两个条目
    • 一个已被弃用。
    • 另一个不是。
  • 对于现代用法,似乎没有任何建议。 (或者我没有找到)

那么,对于PySide2.QtGui.QPixmapCache.find(key, pixmap)弃用的建议修复方法是什么?

3 个答案:

答案 0 :(得分:1)

建议的解决方法是避免将像素图作为第二个参数传递给find,因为它实际上并不是必需的(请参见下文)。因此,您的代码应该简单地更改为:

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

包含第二个参数的方法似乎是PySide2中的一个bug(或功能不当)。它可能应该只实现了这两个重载:

  •   

    查找(str)-> QPixmap

  •   

    查找(QPixmapCache.Key)-> QPixmap

其他方法是C ++特有的,它们当前的定义如下:

  •   

    查找(const QString&key,QPixmap * pixmap)-> bool

  •   

    查找(const QPixmapCache :: Key&key,QPixmap * pixmap)-> bool

这里的第二个参数是 pointer ,Qt会将其设置为找到的像素图。它必须在C ++中以这种方式完成,因为没有办法像在Python中那样返回(bool, QPixmap)的元组。同样,在PySide中实现这种方法几乎没有意义,因为Python中没有指针。 (我猜想不赞成使用的方法在传入的参数上使用类似QPixmap.swap的方式来获得类似的行为。)

应在PySide bug tracker上报告当前API /文档中的混乱之处。作为参考,PyQt5仅实现上面显示的前两个方法,这似乎是最Python化的方法。很难理解为什么应该包含任何其他重载(出于向后兼容的原因)。

答案 1 :(得分:1)

@ekhumoro指出它看起来像是一个错误,但是以下方法当前可以使用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

答案 2 :(得分:0)

因此,实际上一个参数的版本PySide2.QtGui.QPixmapCache.find(key)也引发了DeprecationWarning。最后,必须使用@eyllanesc建议的方式进行修复,这对我来说有点不方便,因为我是事先从哈希数据中生成密钥的。支持两个答案并接受@eyllanesc的答案。谢谢!