使用 QGraphicsScene::addItem 将 QPixmap 项目添加到 QGraphicsScene 会导致 PySide 崩溃

Posted

技术标签:

【中文标题】使用 QGraphicsScene::addItem 将 QPixmap 项目添加到 QGraphicsScene 会导致 PySide 崩溃【英文标题】:Adding QPixmap item to QGraphicsScene using QGraphicsScene::addItem crashes PySide 【发布时间】:2013-06-08 08:48:36 【问题描述】:

我正在尝试将图像添加到QGraphicsView/QGraphicsScene,以便稍后我可以根据用户的输入在其上绘制简单的几何图形。我需要确保图像适合QGraphicsView,无论其纵横比如何。为此,我使用QGraphicsView::fitInView

工作版本:

如果我使用QGraphicsScene::addPixmap,我可以成功添加、显示和适合图像

from PySide import QtGui
import sys
app = QtGui.QApplication(sys.argv)

scn = QtGui.QGraphicsScene()
view = QtGui.QGraphicsView(scn)

pixmap = QtGui.QPixmap("image.png")
gfxPixItem = scn.addPixmap(pixmap)

view.fitInView(gfxPixItem)
view.show()

sys.exit(app.exec_())

非工作版本:

但是,如果不是使用QGraphicsScene::addPixmap,而是首先创建一个QGraphicsPixmapItem 并使用QGraphicsScene::addItem 将其添加到场景中,我会得到一个segfault

from PySide import QtGui
import sys

app = QtGui.QApplication(sys.argv)
scn = QtGui.QGraphicsScene()
view = QtGui.QGraphicsView(scn)

pixmap = QtGui.QPixmap("image.png")
pixItem = QtGui.QGraphicsPixmapItem(pixmap)
gfxPixItem = scn.addItem(pixItem)

view.fitInView(gfxPixItem) # Crashes, see below for call stack in OSX
view.show()

sys.exit(app.exec_())

我在 OSX 和 Linux 上都试过了,结果相同。 我在这里做错了什么?

我需要第二种方法的原因是我可以将QGraphicsPixmapItem 子类化以重新实现mouseEvent 函数。


这是崩溃的线程:

0   QtGui               0x000000011073bb52 QGraphicsItem::isClipped() const + 4
1   QtGui               0x0000000110779ad6 QGraphicsView::fitInView(QGraphicsItem const*, Qt::AspectRatioMode) + 32
2   QtGui.so            0x000000010f72333d Sbk_QGraphicsViewFunc_fitInView + 1153
3   org.python.python   0x000000010f2895a9 PyEval_EvalFrameEx + 9244
4   org.python.python   0x000000010f287147 PyEval_EvalCodeEx + 1934
5   org.python.python   0x000000010f2869b3 PyEval_EvalCode + 54
6   org.python.python   0x000000010f2c2c70 0x10f270000 + 339056
7   org.python.python   0x000000010f2c2d3c PyRun_FileExFlags + 165
8   org.python.python   0x000000010f2c2726 PyRun_SimpleFileExFlags + 410
9   org.python.python   0x000000010f2e6e27 Py_Main + 2715
10  libdyld.dylib       0x00007fff861b47e1 start + 1

【问题讨论】:

【参考方案1】:

QGraphicsScene::addItem(QGraphicsItem *item) 返回void,所以gfxPixItem 为无。当您尝试调用view.fitInView(None) 时,会导致崩溃。

更正的代码:

pixmap = QtGui.QPixmap("image.png")
pixItem = QtGui.QGraphicsPixmapItem(pixmap)
scn.addItem(pixItem)
view.fitInView(pixItem)

【讨论】:

我还编辑了原始问题以处理错位的ret 变量。

以上是关于使用 QGraphicsScene::addItem 将 QPixmap 项目添加到 QGraphicsScene 会导致 PySide 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)