2

モニターのフレームバッファー全体を占有するフレームレスおよびフルスクリーンの 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();
}

QGraphicsScene RectがQGraphicsViewビューポートの境界外にあるときに表示されるQGraphicsViewにスクロールバーが表示されることがわかりました。ただし、上記のコードに示すように、両方とも完全に一致します。次を使用してスクロールバーを非表示にしても:

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

QGraphicsView に表示されない QGraphicsScene の一部がまだあることを意味する、下と右の四角形が不完全に切り取られていることがわかりました。これはなぜですか?

明らかに、私の混乱は、シーン座標をビュー内の座標にマッピングすることにあります。QGraphicsView リファレンスの座標系に関する情報を読んでも、何が問題なのかわかりません。助けてください。

4

1 に答える 1