2011-05-30 445 views
2

我在这里完全丧失...的QPixmap fromImage导致分段故障

我想一个QImage的转换为QPixmap的,但我的程序保持与以下堆栈跟踪崩溃。奇怪的是,如果我指定的QRectF没有左上角的点(0,0),它会正常工作。我知道QImage也有一个复制方法,但那也是失败的(没有有用的堆栈跟踪),所以我想我会尝试使用Pixmaps来代替...... Line的4/5的堆栈跟踪是我的,但我'米基本上是做以下

QImage _drawing = QImage(1024, 1024); 
// fill _drawing with some data 

QRect i_work = QRect(1, 1, 10, 10); 
QRect i_break = QRect(0, 0, 10, 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, 
    receiver=0xbf43978, e=0x28d5fc) at kernel\qapplication.cpp:4392 
#14 0x018d7909 in QApplication::notify (this=0x28fe34, receiver=0xbf43978, 
    e=0x28d5fc) at kernel\qapplication.cpp:3959 
#15 0x6a1ff9dc in QCoreApplication::notifyInternal (this=0x28fe34, 
    receiver=0xbf43978, 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: } 
+0

QBasicAtomicInt无关紧要,因为传递给它的值已经无效。这表明QImage中的QImageData,d未被初始化。我查看了QImage的所有构造函数,并且它们都初始化了d,所以它很奇怪。 – sep 2011-05-30 09:19:23

回答

1

我成功地解决了这个问题,但是我不确定潜在的问题,因为解决方法并没有真正地对我有很大的意义。

所以我把QImage放在/QGraphicsView上。我在场景(0,0)处有我的QImage,在位置(0,0)处有另一个QGraphicsItem。在调用QImage上的副本之前,从现场除去其他QGraphicsItem似乎解决了问题。我不知道点(0,0)有什么特别之处。我唯一能想到的就是isNullQPoint(0,0)返回true

1

这是很难说到底是怎么回事。然而QT文件为QImage constructor

警告:这将创建一个QImage的 未初始化的数据。在调用填充() 以用适当的 像素值填充图像,然后使用QPainter将其映射到 之前。

确保通过调用fill()方法正确填充您的QImage。也许这是问题的原因。