2015-06-21 63 views
1

我有一个QPixmap子额外类方法make铸造一个QObject子类的实例

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创建的实例不是Screenshot

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> Screenshot.grabWindow(desktop_widget.winId()) 
<PyQt4.QtGui.QPixmap object at 0x7f0f8154c438> 

如何获得Screenshot实例?

回答

1

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

唯一真正的问题是避免低效复制。然而,QPixmap提供了一个非常快速的拷贝构造函数只是在做这一点,所以你需要的是这样的:

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

看起来不错,但不工作:后'图片= CLS(图片)''图像.size()'为空。可以在PyQt中的错误。现在'image .__ class__ = cls'起作用。 – warvariuc

+0

哦,'image = cls(image)'调用我的'__init__',而不是从C++重载。 – warvariuc

+0

@warvariuc。我的答案完美无缺。你的'__init__'函数(在你的问题中没有显示)显然被破坏了,可能是因为它没有正确调用基类“__init__”。 – ekhumoro