QtWebkit
QObject
別のメソッドから aを返すたびに segfaultsが発生しQObject
ます。
これが私が思い付くことができる最も単純なテスト ケースです (PySide と PyQt4 の両方で機能します)。
#!/usr/bin/env python2
import sys
try:
from PyQt4.QtCore import QObject, QVariant, pyqtProperty
from PyQt4.QtGui import QApplication
from PyQt4.QtWebKit import QWebView
Property = pyqtProperty
except ImportError:
from PySide.QtCore import QObject, Property
from PySide.QtGui import QApplication
from PySide.QtWebKit import QWebView
class TestObject(QObject):
@Property(str)
def property(self):
return 'foo'
class TestObjectContainer(QObject):
@Property(QObject) # Swapping QObject with TestObject doesn't fix it
def object(self):
return TestObject()
if __name__ == '__main__':
application = QApplication(sys.argv)
browser = QWebView()
frame = browser.page().mainFrame()
frame.addToJavaScriptWindowObject('container', TestObjectContainer())
frame.addToJavaScriptWindowObject('test_object', TestObject())
browser.show()
#frame.evaluateJavaScript('test_object.property')
frame.evaluateJavaScript('container.object.property')
sys.exit(application.exec_())
ここに奇妙な部分があります:
test_object.property; // This doesn't segfault
container.object.property; // This does
このように sを返す方法はありますQObject
か? 私は何か間違ったことをしていますか、それともこれはバグですか?
@HYRYの答えの助けを借りて、単純なラッパークラスを作成することになりました:
class WebkitQObject(QObject):
def __init__(self):
super(WebkitQObject, self).__init__()
self.__cache__ = []
def store(self, item):
self.__cache__.append(item)
return self.__cache__[-1]
さて、このコードはわずかな変更で動作します:
class TestObjectContainer(WebkitQObject):
@Property(QObject)
def object(self):
return self.store(TestObject())