【问题标题】:Qt program crashes on QPainter::drawPixmap()Qt 程序在 QPainter::drawPixmap() 上崩溃
【发布时间】:2018-06-02 05:00:38
【问题描述】:

我在调用 QPainter::drawPixmap() 后遇到问题,我的 Qt 程序崩溃。我花了 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;
}

这又会重新生成一个新的像素图

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 行中因段错误而崩溃。

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.3 / mingw53_32
  • 您已经在调试或发布模式下执行了它。它适用于我在带有 Qt 5.10 的 Linux 中正确
  • 那么这是一个错误,报告它:P

标签: c++ qt qt4 qt5


【解决方案1】:

这是 Qt 5.9 和 5.10 中的错误。见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多