Разработка Qt GUI - Отображение 2D-сетки с использованием QGraphicsView - PullRequest
12 голосов
/ 26 ноября 2011

Я новичок в разработке Qt, поэтому я пытаюсь найти решение для пользовательского интерфейса, который мне нужно спроектировать. Мой проект заключается в том, чтобы моделировать игроков в онлайн-играх, перемещающихся по глобальной карте. Чтобы представить карту, мне нужно отобразить 2D-сетку, где каждое пространство в сетке представляет область карты. Затем мне нужно отобразить местоположение каждого игрока в игре. Бэкэнд полностью работает, карта реализована в виде двумерного массива. Я просто застрял на том, как отобразить сетку.

Проведенные мною исследования привели меня к убеждению, что QGraphicsView - лучший способ сделать это, но я не могу найти учебник, относящийся к тому, что мне нужно. Если у кого-нибудь есть какие-либо советы о том, как это реализовать, это будет очень признательно.

Спасибо, Дэн

Ответы [ 3 ]

10 голосов
/ 26 ноября 2011

2D Grid - это не что иное, как набор горизонтальных и вертикальных линий. Предположим, у вас есть карта 500x500, и вы хотите нарисовать сетку, в которой расстояние между линиями в обоих направлениях равно 50. В следующем примере кода показано, как этого добиться.

// create a scene and add it your view
QGraphicsScene* scene = new QGraphicsScene;
ui->view->setScene(scene);

// Add the vertical lines first, paint them red
for (int x=0; x<=500; x+=50)
    scene->addLine(x,0,x,500, QPen(Qt::red));

// Now add the horizontal lines, paint them green
for (int y=0; y<=500; y+=50)
    scene->addLine(0,y,500,y, QPen(Qt::green));

// Fit the view in the scene's bounding rect
ui->view->fitInView(scene->itemsVBoundingRect());

Вам следует проверить документацию QGraphicsView и QGraphicsScene, а также соответствующие примеры . Также вы можете посмотреть графическое представление обучающие видео или некоторые графические представления похожие видео из дней разработчиков Qt.

3 голосов
/ 21 июня 2013

Хорошо, если у вас постоянный размер сетки или даже ограниченное количество размеров сетки, я хотел бы нарисовать блок сетки в gimp или любой другой программе, а затем установить его как кисть фона (рисуйте только снизу и справа). сторона блока) QT повторит изображение и даст вам полную сетку. Я думаю, что это тоже хорошо для производительности.

Это изображение сетки, которое я использовал в одной из моих программ, размером 10x10 пикселей.

grid 10px

Затем вызовите QGraphicsScene setBackgroundBrush в качестве следующего:

    scene->setBackgroundBrush(QBrush(QPixmap(":/grid/grid10.png")));
1 голос
/ 20 мая 2017

Более естественный способ такой:

scene = self.getScene()                    # Your scene.

brush = QBrush()
brush.setColor(QColor('#999'))
brush.setStyle(Qt.CrossPattern)            # Grid pattern.
scene.setBackgroundBrush(brush)

borderColor = Qt.black
fillColor = QColor('#DDD')
rect = QRectF(0.0, 0.0, 1280, 720)         # Screen res or whatever.

scene.addRect(rect,borderColor,fillColor)  # Rectangle for color.
scene.addRect(rect,borderColor,brush)      # Rectangle for grid.

Извините, PyQt ...

...