0

QtWebkitQObject別のメソッドから 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())
4

1 に答える 1

1

QObjectを存続させるには、QObjectへのPython参照が必要です。次のようにコードを変更することで、これをテストできます。

class TestObjectContainer(QObject):
  @Property(QObject)
  def object(self):
    self.tmp = TestObject()
    return self.tmp
于 2012-09-11T06:01:54.820 に答える