【问题标题】:Understanding the Mapping from View Coordinates to Scene Coordinates了解从视图坐标到场景坐标的映射
【发布时间】:2013-07-05 11:13:49
【问题描述】:

我期待下面的 sn-p 代码在占用整个监视器的帧缓冲区的无框架和全屏 QGraphicsView 上显示我的监视器(其分辨率为 1920x1080)的每个角上的 4 个正方形:

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 参考上的信息,但我无法弄清楚出了什么问题。请帮忙。

【问题讨论】:

  • 调用view.fitInView(scene.sceneRect())能正常工作吗?
  • 是的,可以。这是因为 fitInView 缩放场景(通过操作视图矩阵)以适应视图。但这不是我要找的。可以使任何尺寸的场景以这种方式适合 QGraphicsView 。对于我的应用程序,我不能允许这样的缩放。我想要屏幕上的像素和 QGraphicsScene 中的像素之间的 1 对 1 映射。
  • 是的,我知道它是如何工作的,但会根据您的回答问您其他问题。无论如何,我看到你已经解决了,那就太好了。

标签: qt


【解决方案1】:

从 Qt 论坛上cross post I made 的回复中得到答案。

坐标不匹配是由 QGraphicsView 周围的框架引入的额外像素引起的。通过设置解决:

view.setFrameShape(QGraphicsView::NoFrame);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多