【问题标题】:QPixmap fromImage results in Segmentation faultQPixmap fromImage 导致分割错误
【发布时间】:2011-09-04 14:51:46
【问题描述】:

我在这里完全不知所措......

我正在尝试将 QImage 转换为 QPixmap,但我的程序不断因以下堆栈跟踪而崩溃。奇怪的是,如果我指定的 QRectF 的左上角不是 (0, 0),它可以正常工作。我知道 QImage 也有一个复制方法,但这也失败了(没有有用的堆栈跟踪),所以我想我会尝试使用 Pixmaps 来代替...... Line 的堆栈跟踪的 4/5 是我的,但我m 基本上是在做以下事情

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: }

【问题讨论】:

  • QBasicAtomicInt 无关紧要,因为传递给它的 this 的值已经无效。这说明QImage中的QImageData,d没有初始化。看了QImage的所有构造函数,都初始化了d,好奇怪。

标签: c++ qt qt4 segmentation-fault qimage


【解决方案1】:

很难说到底发生了什么。但是QImage constructor 的 QT 文档说

警告:这将创建一个 QImage 带有未初始化的数据。调用填充() 用适当的填充图像 绘制之前的像素值 使用 QPainter。

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

【讨论】:

    【解决方案2】:

    我成功地解决了这个问题,但我不确定根本问题,因为解决方法对我来说并没有多大意义。

    所以我在QGraphicsScene/QGraphicsView 上渲染了QImage。我的QImage 在现场的位置(0,0),另一个QGraphicsItem 也在位置(0,0)。在调用 QImage 上的副本之前从场景中删除另一个 QGraphicsItem 似乎可以解决问题。我不知道(0,0) 有什么特别之处。我唯一能想到的是QPoint(0,0) 上的isNull 返回true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多