放大QGraphicsScene会使我的绘图有时消失

时间:2014-11-12 13:35:33

标签: c++ qgraphicsscene qt4.8 qpixmap

我有一个QGraphicsScene我在其中添加了由{4}组成的QPixmap和每张图片的边框。

我使用总大小创建一个新的QPixmap,然后使用QPainter在较大的像素图中的适当位置绘制每个子图像。完成一个子图像后,立即绘制边框(这可能不是最佳的,但现在我不介意)。

一旦"最终" pixmap结束了,我用

直接插入到场景中
scene->addPixmap( total )

这是pixmap合成的代码:

QPixmap pixFromCube( PanoramicImages* lim ) const
{
    const QSize img_size = getImageSize( lim );
    const QSize pano_size( img_size.width() * 4, img_size.height() );

    QPixmap toret( pano_size );

    if( !toret.isNull() ) {
        QPainter painter( &toret );
        painter.setRenderHint( QPainter::Antialiasing );
        int x( 0 );
        QPixmap pix = lim->getCamera1Image();
        if( !pix.isNull() ) {
            painter.drawPixmap( 0, 0, pix.width(), pix.height(), pix );
            drawPixBorder( painter, pix.rect() );

        }
        x += img_size.width();

        pix = lim->getCamera2Image();
        if( !pix.isNull() ) {
            painter.drawPixmap( x, 0, pix.width(), pix.height(), pix );
            drawPixBorder( painter, QRectF( x, 0, pix.width(),
                                            pix.height() ) )
            ;

        }
        x += img_size.width();

        pix = lim->getCamera3Image();
        if( !pix.isNull() ) {
            painter.drawPixmap( x, 0, pix.width(), pix.height(), pix );
            drawPixBorder( painter, QRectF( x, 0, pix.width(),
                                            pix.height() ) )
            ;
        }
        x += img_size.width();

        pix = lim->getCamera4Image();
        if( !pix.isNull() ) {
            painter.drawPixmap( x, 0, pix.width(), pix.height(), pix );
            drawPixBorder( painter, QRectF( x, 0, pix.width(),
                                            pix.height() ) )
            ;

        }
    }
    return toret;
}

void drawPixBorder( QPainter& painter, const QRectF rect ) const
{
    const QBrush oldBrush = painter.brush();
    const QPen oldPen = painter.pen();

    QColor color( Qt::blue );
    if( timer.isActive() ) {
        color = Qt::green;
    } else {
        color = Qt::red;
    }

    const QBrush brush( color );
    QPen pen( brush, 22 );

    const QPointF points[ 5 ] = {
        rect.topLeft(),
        rect.topRight(),
        rect.bottomRight(),
        rect.bottomLeft(),
        rect.topLeft()
    };
    painter.setBrush( brush );
    painter.setPen( pen );
    painter.drawPolyline( points, sizeof( points ) / sizeof( points[ 0 ] ) );

    painter.setBrush( oldBrush );
    painter.setPen( oldPen );
}

这是第一次加载时的最终像素图:

Initial stage

在几次缩小之后:

Zoomed out

如您所见,右侧有一些边框丢失。再次缩放到初始位置时,将显示边框。如果我使用较小的宽度(例如,5),边框会更快消失。

我在这里和Qt论坛上一直在阅读其他问题,并尝试了一些建议:

pen.setCosmetic( true );

painter.setRenderHint( QPainter::NonCosmeticDefaultPen, false);

或:

painter.setRenderHint( QPainter::Antialiasing );

将笔宽直接设置为0

pen.setWidth( 0 )

和组合。

它们都没有阻止边框消失,使用更大的宽度只会延迟问题。

是否有办法始终显示边框,无论缩放级别如何?


感谢@Robert的帮助。正如他在回答中所述,解决方案是直接在场景中绘制,而不是在像素图中进行,然后添加它。 为了在场景中绘图,我决定使用QPainterPath

    int x( 0 );
    QPainterPath rectPath;
    for( unsigned int i( 0 ); i < 4; ++i ) {
        rectPath.addRect( QRectF( x, 0, width, height ) );
        x += width;
    }

    QColor color( Qt::blue );
    if( timer.isActive() ) {
        color = Qt::green;
    } else {
        color = Qt::red;
    }
    scene->addPath( rectPath, QPen( color ) );

1 个答案:

答案 0 :(得分:1)

这是因为你用来创建像素图的画家对图形场景的变换/比例一无所知......可能的解决方案是在场景中绘制矩形而不是直接绘制像素图。