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

Qt 理解从视图坐标到场景坐标的映射,qt,Qt,我希望下面的代码片段能在占据整个显示器帧缓冲区的无框全屏QGraphicsView上显示显示器每个角落的4个正方形(分辨率为1920x1080): int main(int argc, char **args) { QApplication app(argc, args); const int monitorWidth = 1920; const int monitorHeight = 1080; const int rectDim = 40; QGr

我希望下面的代码片段能在占据整个显示器帧缓冲区的无框全屏QGraphicsView上显示显示器每个角落的4个正方形(分辨率为1920x1080):

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();
}
我发现底部和右侧的方块被不完全剪裁,这意味着QGraphicscene中仍有一些部分在QGraphicsView中不可见。为什么会这样


显然,我的困惑在于将场景坐标映射到视图中的坐标。尽管阅读了参考资料,我还是无法找出哪里出了问题。请帮助。

从Qt论坛上的回复中获得答案

坐标不匹配源于QGraphicsView周围的帧引入的额外像素。可通过设置以下内容来解决此问题:

view.setFrameShape(QGraphicsView::NoFrame);

如果调用view.fitInView(scene.scen直立()),它是否正常工作?是的,可以。这是因为fitInView(通过操纵视图矩阵)缩放场景以适应视图。但那不是我想要的。通过这种方式,可以使任何尺寸的场景都适合QGraphicsView。对于我的应用程序,我不能允许这种扩展。我想在屏幕上的像素和QGraphicscene中的像素之间进行1:1的映射。是的,我知道它是如何工作的,但根据您的回答,我还想问您其他问题。不管怎样,我看你已经解决了,那太好了。
view.setFrameShape(QGraphicsView::NoFrame);