了解从视图坐标到场景坐标的映射

时间:2013-07-08 07:36:30

标签: qt

我期待以下代码片段在我的显示器的每个角落(其分辨率为1920x1080)上显示4个正方形,在无框架和全屏QGraphicsView上占据整个显示器的帧缓冲区:

int main(int argc, char **args)
{
    QApplication app(argc, args);

    const int monitorWidth = 1920;
    const int monitorHeight = 1080;
    const int rectDim = 40;

    QGraphicsView view;
    view.setWindowFlags(Qt::FramelessWindowHint);
    view.setGeometry(0, 0, monitorWidth, monitorHeight);
    view.showFullScreen();

    QGraphicsScene scene;
    scene.setBackgroundBrush(Qt::black);
    scene.setSceneRect(QRectF(0.f, 0.f, monitorWidth, monitorHeight));
    view.setScene(&scene);

    //Create 4 rectangle items
    QGraphicsRectItem items[4];

    //top left corner
    items[0].setRect(QRect(0, 0, rectDim, rectDim));
    items[0].setPen(QPen(Qt::red));
    items[0].setBrush(Qt::red);

    //top right corner
    items[1].setRect(QRect(monitorWidth-rectDim, 0, rectDim, rectDim));
    items[1].setPen(QPen(Qt::red));
    items[1].setBrush(Qt::red);

    //bottom left corner
    items[2].setRect(QRect(0, monitorHeight-rectDim, rectDim, rectDim));
    items[2].setPen(QPen(Qt::red));
    items[2].setBrush(Qt::red);

    //bottom right corner
    items[3].setRect(QRect(monitorWidth-rectDim, monitorHeight-rectDim, rectDim, rectDim));
    items[3].setPen(QPen(Qt::red));
    items[3].setBrush(Qt::red);

    for(unsigned int i=0; i<4; ++i)
    {
        scene.addItem(items+i);
    }

    return app.exec();
}

我发现QGraphicsView中的滚动条在QGraphicsScene Rect超出QGraphicsView视口范围时出现。但是,如上面的代码所示,两者完全匹配。即使我使用以下方法隐藏滚动条:

view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

我发现底部和右边的方块被剪裁得不完整,这意味着QGraphicsScene的某些部分仍然在QGraphicsView中不可见。为什么会这样?

显然,我的困惑在于将场景坐标映射到视图中。尽管阅读了有关coordinate systems in the QGraphicsView参考的信息,但我无法弄清楚出了什么问题。请帮忙。

1 个答案:

答案 0 :(得分:1)

在Qt论坛上回复cross post I made时得到答案。

坐标不匹配源于QGraphicsView周围框架引入的额外像素。它通过设置来解决:

view.setFrameShape(QGraphicsView::NoFrame);