QtWebkit
的方法返回QObject
时, 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
有没有办法像这样返回QObject
?我做错了什么,或者这是一个错误?
我最终在@HYRY's answer的帮助下创建了一个简单的包装类:
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())
答案 0 :(得分:1)
您需要对QObject的Python引用才能使其保持活动状态。您可以通过更改代码来测试这一点,
class TestObjectContainer(QObject):
@Property(QObject)
def object(self):
self.tmp = TestObject()
return self.tmp