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

标签 c++ qgraphicsscene qt4.8 qpixmap

我有一个 QGraphicsScene,我在其中添加了一个 QPixmap,该 QPixmap 由 4 个图像和每个图像的边框组成。

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

“最终”像素图完成后,我直接插入到场景中

scene->addPixmap( total )

这是像素图合成的代码:

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 ) );

最佳答案

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

关于c++ - 放大 QGraphicsScene 有时会使我的绘图消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26888287/

相关文章:

c++ - 使用QAbstractButton::autoRepeat时如何区分按下、释放和长按

c++ - 如果我读取不存在键的 map 值会发生什么?

c++ - 在 C++ 的可变参数模板中获取可变参数 size_t... 参数的总和

c++ - 如何保护系统和数据库之间的密码

C++通过内存地址将多维数组更改为一维数组

c++ - Qt4 : QGraphicsScene/View and custom transformation method?

css - QScrollArea 删除区域内容和滚动条之间的空间。

qt - 查找直线和 QPainterPath 之间的交点

c++ - QT 使用 QGraphics 在一条直线上绘制椭圆或三角形

qt - 从 QListWidget 中删除 QListWidgetItem?