我从PyQt4开始,在最简单的示例中使用QGraphicsScene/View时面临着一个coredump:
#!/usr/bin/python
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
app = QApplication(sys.argv)
grview = QGraphicsView()
scene = QGraphicsScene()
grview.setScene(scene)
grview.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
该程序运行,但关闭它时,它会产生大量的GTK错误(使用Ubuntu),最后是核心转储(分段错误):
(python:2732): Gtk-CRITICAL **: IA__gtk_container_add: assertion `GTK_IS_CONTAINER (container)' failed
(python:2732): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
(python:2732): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
(python:2732): Gtk-CRITICAL **: IA__gtk_container_add: assertion `GTK_IS_CONTAINER (container)' failed
(python:2732): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
(python:2732): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED …Run Code Online (Sandbox Code Playgroud) 从 QML 调用 Python 函数的正确方法是什么,该函数将实例化并将对象返回给 QML,并使 QML 端负责对象的生命周期?我面临的问题是对象在到达 QML 之前就被垃圾收集了。
请注意,我不想在 Python 端保留对对象的显式引用,根据文档中的以下引用,我正在寻找的甚至应该是默认行为:
当数据从 C++ 传输到 QML 时,数据的所有权始终属于 C++。此规则的例外是当从显式 C++ 方法调用返回 QObject 时:在这种情况下,QML 引擎假定对象的所有权......
我创建了一个最小的可运行示例来演示问题(要点链接):
主要.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import signal
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQuick import QQuickView
from PyQt5.QtCore import QUrl, QObject, QVariant, pyqtSlot
from PyQt5.QtQml import QQmlEngine, qmlRegisterType
class Dummy(QObject):
def __del__(self):
print("Deleted")
class GUIEntryPoint(QObject):
@pyqtSlot(result=QVariant)
def get_foo(self):
foo = Dummy()
print("Created {}".format(foo)) …Run Code Online (Sandbox Code Playgroud)