Увеличение в QGraphicsScene заставляет мои рисунки иногда исчезать

0

У меня есть QGraphicsScene где я добавляю QPixmap состоящий из 4 изображений и границ каждого изображения.

Я создаю новый 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 );
}

Здесь конечная pixmap, когда она загружается в первый раз:

Изображение 174551

И вот после нескольких сокращений:

Изображение 174551

Как видите, справа некоторые границы отсутствуют. При возврате назад в исходное положение отображаются границы. Если я использую меньшую ширину для строк (например, 5), границы исчезнут раньше.

Я читал другие вопросы здесь и в форумах Qt и пробовал некоторые предложения вроде:

pen.setCosmetic( true );

или

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

или:

painter.setRenderHint( QPainter::Antialiasing );

установка ширины пера непосредственно на 0

pen.setWidth( 0 )

и комбинации.

Ни один из них не позволил границам исчезнуть, а использование большей ширины просто задерживает проблему.

Есть ли способ всегда показывать границы независимо от уровня масштабирования?


Спасибо @Robert за помощь. Как он заявил в своем ответе, решение заключалось в том, чтобы напрямую рисовать на сцене, а не делать это в pixmap и затем добавлять его. Для рисования на сцене я решил использовать 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 ) );
Теги:
qgraphicsscene
qpixmap
qt4.8

1 ответ

1
Лучший ответ

Это потому, что художник, которого вы используете для создания pixmap, ничего не знает об изменениях/масштабах графической сцены... Возможными решениями были бы рисование прямоугольников внутри сцены, а не непосредственно в pixmap.

  • 0
    Как я уже сказал: setting the pen width directly to 0 and combinations. это не сработало. Если вы не имеете в виду другую ширину. Можно ли указать ширину вне пера?
  • 0
    Переоцените это, sry ... Я думаю, это потому, что художник, который вы используете для создания растрового изображения, ничего не знает о преобразованиях / масштабах графической сцены ... Возможные решения - нарисовать прямоугольники внутри сцены и не напрямую к растровому изображению.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню