[英]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.