Python 强制转换QObject子类实例

Python 强制转换QObject子类实例,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我有一个带有附加类方法的QPixmap子类make: class Screenshot(QtGui.QPixmap): @classmethod def make(cls): desktop_widget = QtGui.QApplication.desktop() image = cls.grabWindow( desktop_widget.winId(), rect.x(), rect.y(), rect.width()

我有一个带有附加类方法的
QPixmap
子类
make

class Screenshot(QtGui.QPixmap):
    @classmethod
    def make(cls):
        desktop_widget = QtGui.QApplication.desktop()
        image = cls.grabWindow(
            desktop_widget.winId(), rect.x(), rect.y(), rect.width(), rect.height())
        import ipdb; ipdb.set_trace() 
        image.save()
        return image
调用
Screenshot.make()
时,会传递正确的类
cls
,但通过
cls.grabWindow创建的实例不是
屏幕快照

ipdb> ...py(30)make()
     29         import ipdb; ipdb.set_trace()
---> 30         image.save()
     31         return image

ipdb> cls
<class 'viewshow.screenshot.Screenshot'>
ipdb> image
<PyQt4.QtGui.QPixmap object at 0x7f0f8c4a9668>
ipdb>…py(30)make()
29进口ipdb;ipdb.set_trace()
--->30 image.save()
31返回图像
ipdb>cls
ipdb>图像
甚至更短:

ipdb> Screenshot.grabWindow(desktop_widget.winId())
<PyQt4.QtGui.QPixmap object at 0x7f0f8154c438>
ipdb>Screenshot.grabWindow(桌面小部件.winId())

如何获取
屏幕截图
实例?

所有从
QPixmap
继承的
Screenshot
方法将返回
QPixmap
,因此您需要显式创建并返回
屏幕截图
的实例

唯一真正的问题是避免低效的复制。但是,
QPixmap
提供了一个非常快速的复制构造函数来实现这一点,所以您所需要的就是这样的东西:

class Screenshot(QtGui.QPixmap):
    @classmethod
    def make(cls):
        ...
        image = cls.grabWindow(...)
        return cls(image)

看起来不错,但不起作用:after
image=cls(image)
image.size()
为空。可能是PyQt中的一个bug。对于现在的代码< C++ > Cys> Cys> Cuth<我的回答很好。您的
\uuuu init\uuuu
函数(在您的问题中未显示)显然已损坏,可能是因为它没有正确调用基类
\uuuuu init\uuuuu
。My
\uuuuu init\uuuu
仅处理传递父小部件的情况。这也为我的需要提供了额外的理由。我想我必须使用
*args、**kwargs
。不过,遗憾的是,
cls.grabWindow(…)
没有在
cls
的实例中返回。这有文件记录吗?PySide也这样做吗?