繁体   English   中英

Qt程序在QPainter :: drawPixmap()上崩溃

[英]Qt program crashes on QPainter::drawPixmap()

我在调用QPainter::drawPixmap()之后Qt程序崩溃的问题。 我花了2天的时间进行调试,并决定必须无意中滥用Qt的某些功能。

有关此问题的有效示例,请参见此处

我的代码包含一个QML文件,该文件更新了以下属性:

Q_PROPERTY(qreal longitude READ getLongitude WRITE setLongitude NOTIFY latitudeChanged)
Q_PROPERTY(qreal latitude READ getLatitude WRITE setLatitude NOTIFY latitudeChanged)

void Map::setLongitude(qreal longitude)
{
    double diff = (this->longitude - this->pixmapCenter.longitude()) * scale;
    this->longitude = longitude;

    if (qFabs(diff) > 50)
    {
        MapTile result = updatePixmap(scale, longitude, latitude);
        pixmap = result.pixmap;
        pixmapCenter = result.center;
    }
    update();
}

void Map::setLatitude(qreal latitude)
{
    this->latitude = latitude;
}

从而重新生成新的Pixmap

MapTile updatePixmap(double scale, double longitude, double latitude)
{

    QPixmap myPixmap(800, 400);
    myPixmap.fill(Qt::transparent);
    QPainter painter(&myPixmap);
    painter.translate(400, 240);
    QPen pen;

    pen.setColor(Qt::white);
    pen.setWidth(1);
    painter.setPen(pen);
    QRectF boundaries(QPointF(-91.55 , 41.55) * scale,
                     QPointF(-91.45, 41.45) * scale);
    boundaries.translate(-longitude * scale, -latitude * scale);
    painter.drawRect(boundaries);
    painter.end();

    QGeoCoordinate center(latitude, longitude);
    return MapTile(myPixmap, center);
}

然后,将新的像素图绘制在屏幕上的适当位置。 重要的是要注意,该程序在崩溃前可以正常运行几秒钟。

它在qdrawhelper_sse2.cpp行587中因segfault错误而崩溃。

void Map::paint(QPainter *painter)
{
    painter->translate(boundingRect().width()/2, boundingRect().height()/2);
    painter->scale(1, -1);

    painter->translate((pixmapCenter.longitude() - longitude) * scale,
                       (pixmapCenter.latitude() - latitude) * scale);
    QPoint corner(-pixmap.width()/2, -pixmap.height()/2);

    painter->drawPixmap(corner, this->pixmap);

}

这是坠机时刻的图像

在此处输入图片说明

这是Qt 5.9和5.10中的错误。 这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM