c++ Qt GUI开发-使用QGraphicsView显示2D网格

ckocjqey  于 2023-05-08  发布在  其他
关注(0)|答案(5)|浏览(317)

我是Qt开发的新手,所以我一直在努力研究一个我需要设计的用户界面的解决方案。我的项目是模拟在线游戏中的玩家在全球Map上移动。为了表示Map,我需要显示一个2D网格,网格中的每个空间表示Map的一个区域。然后我需要显示游戏中每个玩家的位置。后端完全可以工作,Map实现为2D数组。我只是不知道如何显示网格。
我所做的研究使我相信QGraphicsView是做到这一点的最佳方法,但我似乎找不到与我所需要的相关的教程。如果任何人有任何关于如何实现这一点的提示,将不胜感激。
谢谢,丹

pbgvytdp

pbgvytdp1#

二维网格只不过是一组水平和垂直线。假设你有一个500x500的Map,你想绘制一个网格,其中两个方向上的线之间的距离是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());

您应该检查QGraphicsViewQGraphicsScene文档以及相应的examples。你也可以观看图形视图training videos或一些图形视图相关的视频,从Qt开发者的日子。

exdqitrt

exdqitrt2#

好吧,如果你有一个恒定的网格大小,甚至是有限数量的网格大小,我喜欢做的是在gimp或任何其他程序中绘制一个网格块,然后将其设置为背景画笔(只绘制块的底部和右侧)qt将重复图像,并将给予你一个完整的网格。我认为这对性能也有好处。
这是我在我的一个程序中使用的网格图像,它是10x10像素。

然后调用QGraphicsScene setBackgroundBrush如下:

scene->setBackgroundBrush(QBrush(QPixmap(":/grid/grid10.png")));
t40tm48m

t40tm48m3#

更本土的方式是这样的:

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…

z9smfwbn

z9smfwbn4#

假设一个场景被设置为graphicsview,那么下面一行将显示网格。

ui->graphicsView->scene()->setBackgroundBrush(Qt::CrossPattern);

可以为ex传递几个其他值:Qt::Dense7Pattern
这些是enum BrushStyle的成员,只需在Qt creator中单击任何使用的值,它将带您到enum声明,在那里您可以看到所有其他可能的值。
PS:场景可以这样设置:

ui->graphicsView->setScene(new QGraphicsScene());
of1yzvn4

of1yzvn45#

实际上有一个Qt示例代码演示了QGraphicsView/QGraphicsScene中的网格线。在图场景示例中,可以启用网格线。该实现使用了QGraphicsScene::setBackgroundBrush,如果你仔细研究这个例子,你会发现这种方法的问题所在:如果你对场景应用缩放变换,背景笔刷会变成像素化。
如果您要允许深度缩放场景,更好的方法是继承GraphicsScene并在自定义场景类中覆盖drawBackground()。这样做非常容易,因为drawBackround接收到一个矩形,要在场景坐标中绘制;你只需要找出矩形中的网格线。

相关问题