如何解决来自图像的QPixmap导致分割错误
| 我在这里完全不知所措... 我正在尝试将QImage转换为Qpixmap,但是我的程序始终由于以下堆栈跟踪而崩溃。奇怪的是,如果我指定的QRectF的左上角没有(0,0),那么它可以正常工作。我知道QImage也有一个复制方法,但是那也失败了(没有有用的stacktrace),所以我想我会尝试使用pixmaps代替... Line 4/5的stacktrace是我的,但我基本上是在做以下事情QImage _drawing = QImage(1024,1024);
// fill _drawing with some data
QRect i_work = QRect(1,1,10,10);
QRect i_break = QRect(0,10);
Qpixmap foo = Qpixmap::fromImage(_drawing);
// Qpixmap good = foo.copy(i_work); // I work
Qpixmap broken = foo.copy(i_break); // Segmentation fault...
堆栈跟踪:
Program received signal SIGSEGV,Segmentation fault.
0x01f44024 in QBasicAtomicInt::ref (this=0xabababab)
at ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h:120
120 ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h: No such file
or directory.
in ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h
(gdb) bt
#0 0x01f44024 in QBasicAtomicInt::ref (this=0xabababab)
at ../../include/QtCore/../../src/corelib/arch/qatomic_i386.h:120
#1 0x01964d3e in QImage::QImage (this=0x28cc70,image=...)
at image\\qimage.cpp:1125
#2 0x01990682 in QRasterpixmapData::fromImage (this=0xc391a00,sourceImage=...,flags=...) at image\\qpixmap_raster.cpp:151
#3 0x019862ab in Qpixmap::fromImage (image=...,flags=...)
at image\\qpixmap.cpp:2031
#4 0x00423fdc in TxImage::getSelection (this=0xc3b6cb0,selection_area=...)
at TxImage.cpp:207
#5 0x004421e2 in RomView::mouseReleaseEvent (this=0xc397978,event=0x28d5fc)
at RomView.cpp:261
#6 0x019241a0 in QWidget::event (this=0xc397978,event=0x28d5fc)
at kernel\\qwidget.cpp:8187
#7 0x01c9e6bc in qframe::event (this=0xc397978,e=0x28d5fc)
at widgets\\qframe.cpp:557
#8 0x01d2bf0f in QAbstractScrollArea::viewportEvent (this=0xc397978,e=0x28d5fc) at widgets\\qabstractscrollarea.cpp:1043
#9 0x01e9aae6 in QGraphicsView::viewportEvent (this=0xc397978,event=0x28d5fc) at graphicsview\\qgraphicsview.cpp:2862
#10 0x01f86a13 in QAbstractScrollAreaPrivate::viewportEvent (this=0xc3969f8,event=0x28d5fc) at widgets//qabstractscrollarea_p.h:100
#11 0x01f8506c in QAbstractScrollAreaFilter::eventFilter (this=0xbfa7388,o=
0xbf43978,e=0x28d5fc) at widgets//qabstractscrollarea_p.h:116
#12 0x6a1ffc73 in QCoreApplicationPrivate::sendThroughObjectEventFilters (
this=0xa7a46d8,receiver=0xbf43978,event=0x28d5fc)
at kernel\\qcoreapplication.cpp:847
#13 0x018d96e5 in QApplicationPrivate::notify_helper (this=0xa7a46d8,e=0x28d5fc) at kernel\\qapplication.cpp:4392
#14 0x018d7909 in QApplication::notify (this=0x28fe34,e=0x28d5fc) at kernel\\qapplication.cpp:3959
#15 0x6a1ff9dc in QCoreApplication::notifyInternal (this=0x28fe34,event=0x28d5fc) at kernel\\qcoreapplication.cpp:732
#16 0x01f4d53e in QCoreApplication::sendSpontaneousEvent (receiver=0xbf43978,event=0x28d5fc)
at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:218
#17 0x018d6118 in QApplicationPrivate::sendMouseEvent (receiver=0xbf43978,event=0x28d5fc,alienWidget=0xc3adb70,nativeWidget=0x28fd60,buttonDown=0x237941c,lastMouseReceiver=...,spontaneous=true)
at kernel\\qapplication.cpp:3056
#18 0x0193fc63 in QETWidget::translateMouseEvent (this=0x28fd60,msg=...)
at kernel\\qapplication_win.cpp:3317
#19 0x0193aaa6 in QtWndProc (hwnd=0x130fb8,message=514,wParam=0,lParam=5373956) at kernel\\qapplication_win.cpp:1657
#20 0x762c62fa in USER32!OffsetRect () from C:\\Windows\\syswow64\\user32.dll
#21 0x900010c2 in ?? ()
#22 0x90909090 in ?? ()
#23 0x00df7d80 in operator+ ()
Backtrace stopped: prevIoUs frame inner to this frame (corrupt stack?)
(gdb)
我向您保证qatomic_i386.h存在,并查看第120行...
112: inline bool QBasicAtomicInt::ref()
113: {
114: unsigned char ret;
115: asm volatile(\"lock\\n\"
116: \"incl %0\\n\"
117: \"setne %1\"
118: : \"=m\" (_q_value),\"=qm\" (ret)
119: : \"m\" (_q_value)
120: : \"memory\");
121: return ret != 0;
122: }
解决方法
很难说是怎么回事。但是QImage构造函数的QT Doc说
警告:这将创建一个QImage
与未初始化的数据。呼叫fill()
用适当的图像填充图像
绘制之前的像素值
与QPainter。
通过调用fill()方法确保QImage正确填充。也许这就是问题的原因。
, 我能够成功解决问题,但是我不确定潜在的问题,因为该解决方法对我而言并没有多大意义。
所以我在
QGraphicsScene
/QGraphicsView
上渲染QImage
。我在场景中的位置(0,0)有QImage
,在位置(0,0)处也有QGraphicsItem
。在调用QImage
上的副本之前,从场景中删除另一个QGraphicsItem
似乎可以解决此问题。我不知道ѭ10点有何特别之处。我唯一想到的是QPoint(0,0)
上的isNull
返回true
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。