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

时间:2011-11-26 15:45:01

标签: c++ qt user-interface qgraphicsview

我是Qt开发的新手,所以我正在尝试研究我需要设计的用户界面的解决方案。我的项目是模拟在全球地图中移动的在线游戏中的玩家。为了表示地图,我需要显示2D网格,网格中的每个空间代表地图的一个区域。然后我需要显示游戏中每个玩家的位置。后端完全正常工作,地图实现为2D阵列。我只是坚持如何显示网格。

我所做的研究让我相信QGraphicsView是最好的方法,但我似乎无法找到与我需要的相关的教程。如果有人对如何实现这一点有任何提示,将不胜感激。

谢谢,Dan

4 个答案:

答案 0 :(得分:10)

2D网格只不过是一组水平和垂直线条。假设您有一个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());

您应该查看QGraphicsViewQGraphicsScene文档以及相应的examples。您还可以在Qt开发者日期间观看图形视图training videos或某些图形视图related videos

答案 1 :(得分:3)

如果您有一个恒定的网格大小或甚至有限数量的网格大小,我想做的是在gimp或任何其他程序中绘制网格块然后将其设置为背景画笔(仅绘制底部和右侧块的一侧)qt将重复图像,并为您提供一个完整的网格。我认为这对性能也有好处。

这是我在我的一个程序中使用的网格图像,它是10x10像素。

grid 10px

然后调用QGraphicsScene setBackgroundBrush作为以下内容:

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

答案 2 :(得分:1)

更原生的方式是:

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 ......

答案 3 :(得分:0)

假定将场景设置为graphicsview,然后仅在一行下面显示网格。

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

可以为ex传递其他几个值:Qt::Dense7Pattern

这些是enum BrushStyle的成员,只需单击Qt创建器中的任何使用的值,它将带您到枚举声明,您可以在其中看到所有其他可能的值。

PS: 可以这样设置场景:

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