在QGraphicsView中支持三种不同的坐标系统---视口坐标、场景坐标、项坐标
场景坐标就是系统窗口(QGraphicsScene)的坐标,它(0,0)作为它的左上角坐标.
视口坐标相当于场景坐标的数学变换,如当一个窗口坐标为(0,0)至(100,100)那么这个窗口就是实实在在的由100*100个像素组成,此时把坐标变换为(-50,50)(即场景坐标(0,0))至(50,-50)(即场景坐标为(100,100))那么这个视口坐标就是以(0,0)为中心了.当放大缩小item时可以改变视口坐标的大小(如放大1倍)视口坐标可以变为(0,0)至(50,50).
而项坐标则为item本身的坐标,它不随场景坐标、视口坐标变化并且以(0,0)为中心.
在c++ GUI Qt编程(第二版) Cityscape中有段这样的程序:
QRectF Annotation::boundingRect()const
{
QFontMetrics metrics(font);
QRectF rect=metrics.boundingRect(str);//计算文字外接矩形
rect.translate(-rect.center());
rect.adjust(-4,0,+4,0);
return rect;
}
void Annotation::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
if(option->levelOfDetail<=threshold)
return;
painter->setFont(font);
QRectF rect=boundingRect();
int alpha=int(30*std::log(option->levelOfDetail));
if(alpha>=32){
qDebug()<<"\ndraw white rect";
} painter->fillRect(rect,QColor(100,255,255,80));
painter->setPen(Qt::white);
//创建阴影效果
painter->drawText(rect.translated(+1,+1),str,
QTextOption(Qt::AlignCenter));
painter->setPen(Qt::blue);
painter->drawText(rect,str,QTextOption(Qt::AlignCenter));
}
在paint函数中painter直接用rect绘图这是因为Annotation的父类中setPos()设置了Annotatio的场景坐标.
void QPainter::fillRect(const QRectF & rectangle, const QBrush & brush)
fillRect等函数形参坐标为项坐标,在函数内项坐标与场景坐标合成就能绘出指定位置的item了