У меня есть 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, когда она загружается в первый раз:
И вот после нескольких сокращений:
Как видите, справа некоторые границы отсутствуют. При возврате назад в исходное положение отображаются границы. Если я использую меньшую ширину для строк (например, 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 ) );
Это потому, что художник, которого вы используете для создания pixmap, ничего не знает об изменениях/масштабах графической сцены... Возможными решениями были бы рисование прямоугольников внутри сцены, а не непосредственно в pixmap.
setting the pen width directly to 0 and combinations.
это не сработало. Если вы не имеете в виду другую ширину. Можно ли указать ширину вне пера?