我有一个 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 );
}
这是第一次加载时的最终像素图:
经过几次缩小之后:
如您所见,右侧缺少一些边框。当再次缩放回到初始位置时,会显示边框。如果我使用较小的线条宽度(例如 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/