首页 > 解决方案 > QPainter 恢复为什么会导致段错误?

问题描述

我的程序有时(低概率)因以下信息回溯而崩溃:

Error: signal 11:
/ri/flamingo_console(_Z7handleri+0x174)[0x884a14]
/lib/libc.so.6(__default_sa_restorer_v2+0x0)[0xb5d3de60]
/lib/libc.so.6(memcpy+0x74)[0xb5d94124]
/ri/Qt5.5/lib/libQt5Core.so.5(_ZN7QString11reallocDataEjb+0x8c) 
[0xb60f2f68]
/ri/Qt5.5/lib/libQt5Gui.so.5(+0x2f2284)[0xb6923284]  
/ri/flamingo_console[0x5f75a8]
/ri/flamingo_console[0x54f6e4]

我使用addr2line的工具,发现0x5f75a8的文本地址在以下函数中:

void RElementStyle::drawText( QPainter &painter,
           const QRect &rect,
           const QString &str,
           Qt::AlignmentFlag align )
{
    painter.save();
    painter.setPen( mCommon.getColor( mStatus, str) );
    //! font
    QFont font = qApp->font();
    font.setPointSize( mCommon.mContentFont.mSize );
    painter.setFont( font );
    painter.drawText( rect,
                  align | Qt::AlignVCenter,
                  str );
    painter.restore();  //! this is the crash line 0x54f6e4
}

我了解了有关painter.restore() 的一些东西,并且我知道restore() 会弹出painter 的设置。但是,我不明白为什么restore 会导致段错误。谁能帮我分析一下?非常感谢。

标签: qtsegmentation-faultqpainter

解决方案


推荐阅读