Qt中QGraphicsView三种坐标系统详解

在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;
}

一开始我看到这段程序时总是不理解rect的坐标是怎么来的,它是用str计算外接矩形,但是外接矩形哪里有坐标呢?后来仔细想想在这程序之前在图表应用程序中也有这样的代码,书上是这样说的:"由字体规格函数返回的外接矩形总是把(0,0)作为其左上角".现在理解这句话的意思为: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了


你可能感兴趣的:(Qt,c++)