我有一个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 );
}
这是第一次加载时的最终像素图:
在几次缩小之后:
如您所见,右侧有一些边框丢失。再次缩放到初始位置时,将显示边框。如果我使用较小的宽度(例如,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 ) );
答案 0 :(得分:1)
这是因为你用来创建像素图的画家对图形场景的变换/比例一无所知......可能的解决方案是在场景中绘制矩形而不是直接绘制像素图。