Important: Please read the Qt Code of Conduct -

Problem with item positioning

  • Hi.

    I'm trying to write a simple Snake game with Qt but I have issues with the positioning of the fruit. When the Snake eats the fruit (meaning that if the SnakeHead collides with the fruit) the Fruit should respawn in a random location on the screen.

    For that, I use the height and width of the QGraphicsView. As long as I don't resize the window this works fine, but as soon as I do the Fruit will eventually spawn outside of the visible view.

    I did some debugging and found that the coordinates are fine. E.g. when I enter fullscreen mode, the QGraphicsView size is 1440x900, as expected on my MacBook Pro, since it has a 1440x900 system resolution despite the 2880x1800 display resolution.

    But when the Fruit spawns at, for example, width=1237, height=626, it is not visible. Only when I scale the screen to 1920x1200 I can see it to the very right.

    This is how I place the Fruit:

    void Game::spawnFruit(){
        int width = rand() % (QGraphicsView::width() - 100);
        int height = rand() % (QGraphicsView::height() - 100);
        f1->setPos(width, height);
        QList<QGraphicsItem*> cItems = scene->collidingItems(f1);
        if(!cItems.empty()) {

    Again, this only happens when enlarging the window, it works fine if I make it smaller or launch it at full resolution. It probably has something to do with this:

    Game::Game(QWidget *parent): QGraphicsView(parent){
        scene = new QGraphicsScene(0,0,800,600);

    So basically, as soon as the window / QGraphicsView becomes bigger than the QGraphicsScene this problem occurs. If it's smaller, then the window becomes scrollable but the Fruit always spawns within the size of the window. Is there a way to make this responsive?

    I'm using Qt Creator 4.5.0 based on Qt 5.10.0.

    Thanks in advance.

  • When you place fruit, you do that within the GraphicsScene. So it's the size of the GraphicsScene that matters, not the size of the GraphicsView.
    QGraphicsScene::sceneRect() might be what you need.

Log in to reply