Qt 程序在 QPainter::drawPixmap() 上崩溃
Qt program crashes on QPainter::drawPixmap()
我遇到问题,我的 Qt 程序在调用 QPainter::drawPixmap()
后崩溃。我花了 2 天时间对此进行调试,并确定我一定是无意中滥用了 Qt 的某些功能。
A working example of this problem can be found here.
我的代码包含一个更新以下属性的 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);
}
然后在屏幕上适当的位置绘制这个新的像素图。重要的是要注意程序在崩溃之前运行良好的几秒钟。
它因第 587 行 qdrawhelper_sse2.cpp 中的段错误而崩溃。
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 中的错误。参见 here。
我遇到问题,我的 Qt 程序在调用 QPainter::drawPixmap()
后崩溃。我花了 2 天时间对此进行调试,并确定我一定是无意中滥用了 Qt 的某些功能。
A working example of this problem can be found here.
我的代码包含一个更新以下属性的 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);
}
然后在屏幕上适当的位置绘制这个新的像素图。重要的是要注意程序在崩溃之前运行良好的几秒钟。
它因第 587 行 qdrawhelper_sse2.cpp 中的段错误而崩溃。
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 中的错误。参见 here。