QGraphicsView、QGraphicsScene、QGraphicsItem 和 Qt GUI(QGuiApplication)可以用来构建和管理基于图形的用户界面。
一、它们之间的关系:
QGuiApplication 作为应用程序的基础,提供了窗口和事件管理等功能。
QGraphicsView 则是用来显示和交互 QGraphicsScene 中的图形元素的窗口。
QGraphicsScene 提供了一个场景,用于存储和管理图形元素。
1.Qt GUI(QGuiApplication):
QGuiApplication 是 Qt 中负责管理应用程序的图形界面的基础类。它提供了事件循环和事件处理,处理用户输入、窗口管理等基本功能。它是所有 Qt 图形应用程序的入口点。
2.QGraphicsView:
QGraphicsView 是用于显示 QGraphicsScene 内容的可视化窗口或视图。它允许用户查看和交互 QGraphicsScene 中的图形项。QGraphicsView 提供了用户交互、视图变换、事件处理等功能,以便用户可以浏览和编辑场景中的内容。QGraphicsView 可以显示 QGraphicsScene 的内容,并允许用户与场景中的图形项进行交互。
3.QGraphicsScene:
QGraphicsScene 是一个虚拟的二维平面,用于存储和管理 2D 图形项(QGraphicsItem)。它提供了一个环境,使得图形项可以在其中交互、布局和渲染。QGraphicsScene 可以包含多个图形项,并且允许这些图形项之间相互作用。它相当于一个画布或者场景,用于存储和管理图形元素。
QGraphicsView 和 QGraphicsScene 是 Qt 中用于构建基于图形的用户界面的重要组件,它们通过 Qt GUI(QGuiApplication)来管理窗口和事件处理等基本功能,共同构建出丰富的图形界面应用程序。
二、详细说明
1、QGraphicsView
QGraphicsView 是 Qt 中图形视图框架的一部分,它提供了一个用于在应用程序中显示 QGraphicsScene 的视图窗口。可以将 QGraphicsView 理解为显示 QGraphicsScene 内容的窗口。
以下是一些 QGraphicsView 的主要特性和用途:
1.显示场景内容: 主要用于显示 QGraphicsScene 中的图形项。QGraphicsView 可以显示场景中的所有或部分图形项,允许用户与这些图形项进行交互。
2.支持交互操作: QGraphicsView 提供了用户交互的支持,包括拖动、缩放、平移等。用户可以通过鼠标和键盘来对视图进行操作,以便更好地浏览和编辑场景中的内容。
3.多视图支持: 一个 QGraphicsScene 可以在多个 QGraphicsView 中显示,每个视图可以显示相同或不同的场景内容。这使得可以在不同的视图中以不同的方式查看和编辑同一个场景。
4.视图变换: QGraphicsView 支持视图变换,包括缩放、旋转和平移。这使得用户可以调整视图以查看场景的不同部分,而不仅仅是整个场景。
5.渲染控制: 提供了一些方法和选项,用于控制视图的渲染行为,包括渲染提示(render hints)的设置、视图的抗锯齿设置等。
6.事件处理: QGraphicsView 能够处理鼠标、键盘和其它事件,并将这些事件传递给场景中的相应图形项。这使得可以实现基于图形项的事件处理逻辑。
7.视口更新: QGraphicsView 管理视口更新,可以选择在需要时仅更新可见区域,以提高性能。
总的来说,QGraphicsView 是一个用于在用户界面中显示和交互 QGraphicsScene 的重要组件,为开发图形化应用程序提供了强大的工具。
2、QGraphicsScene
可以将 QGraphicsScene 理解为一个画布或者场景。在 Qt 的图形视图框架中,QGraphicsScene 是一个用于存储和管理 2D 图形项(QGraphicsItem)的场景。这个场景可以被视为一个虚拟的平面,上面可以放置各种图形元素。
类比于绘画,你可以把 QGraphicsScene 想象成一个画布,而图形项则是在画布上绘制的各种元素,如图形、文本、图像等。这种模型允许你以逻辑方式组织和管理这些图形元素,使其在应用程序中可以进行交互、移动、旋转等操作。
QGraphicsScene 还可以与 QGraphicsView 和 QGraphicsItem 一起使用,QGraphicsView 是用于显示场景的视图,而 QGraphicsItem 是场景中的图形元素。通过这个框架,你可以创建出丰富交互的图形用户界面,例如绘图应用程序、图形编辑器等。
3、QGraphicsItem
QGraphicsItem 是 Qt 中用于在 QGraphicsScene 中绘制图形元素的基类。它提供了一个抽象接口,用于创建自定义的可视图形项,并在场景中进行管理和交互。QGraphicsItem 是所有可在场景中显示的图形项的基类,它定义了一系列方法和属性,用于管理图形项的外观、位置、变换和事件处理等功能。
以下是 QGraphicsItem 的一些关键特性和用法:
图形项的基本属性:
位置(Position):图形项的位置是相对于其父级项或场景的坐标系统而言的。
外观(Appearance):通过设置 QPen 和 QBrush,可以定义图形项的边框和填充的样式、颜色等外观属性。
图形项的坐标系统:
图形项的坐标系统是相对于其父级项或者场景的坐标系统而言的。可以使用 scenePos() 获取图形项在场景中的位置。
自定义绘制:
可以重写 paint() 函数,自定义绘制图形项的外观。在 paint() 函数中,可以使用 QPainter 对象进行绘制操作。
事件处理:
图形项可以处理鼠标、键盘和其它事件。可以重写 mousePressEvent、mouseReleaseEvent 等事件处理函数,以实现自定义的交互逻辑。
变换和转换:
图形项可以进行平移、缩放、旋转等变换操作。可以使用 setTransform() 方法来设置图形项的变换矩阵。
碰撞检测:
图形项可以检测与其它图形项的碰撞。可以使用 collidesWithItem()、collidesWithPath() 等方法来进行碰撞检测。
父子关系:
图形项可以组织成父子关系,形成一个树形结构。子项的位置和变换是相对于其父项的。
继承和自定义:
可以通过继承 QGraphicsItem 类来创建自定义的图形项,并实现特定的绘制和交互逻辑。
QGraphicsItem 提供了一个灵活的机制,用于创建自定义的图形元素,并在 QGraphicsScene 中进行管理和交互。通过继承和重写 QGraphicsItem 的方法,可以实现各种复杂的图形元素和交互效果,用于构建丰富的图形用户界面应用程序。
4、QGraphicsRectItem
QGraphicsRectItem 的父类是(QGraphicsItem),用于在 QGraphicsScene 中表示矩形。这是一个简单的图形项类,用于显示和管理矩形的图形元素。同理还有QGraphicsPolygonItem多边形,QGraphicsLineItem直线等都是继承自(QGraphicsItem)。
以下是QGraphicsRectItem的一些关键的特性和使用方式:
创建 QGraphicsRectItem:
可以通过构造函数创建 QGraphicsRectItem,并指定矩形的位置、大小以及父级项(如果有的话):
QGraphicsRectItem *rectItem = new QGraphicsRectItem(x, y, width, height);
设置矩形属性:
可以通过 setRect() 方法设置矩形的位置和大小:
rectItem->setRect(x, y, width, height);
继承和重写:
QGraphicsRectItem 是 QGraphicsItem 的子类,因此可以继承其所有功能。如果需要自定义行为,可以重写虚函数,例如 paint() 以实现自定义的绘制。
图形项的位置和坐标系统:
图形项的位置是相对于其父级项或者场景的坐标系统而言的。可以使用 scenePos() 获取在场景中的位置。
事件处理:
可以重写 QGraphicsItem 的事件处理函数,例如 mousePressEvent 和 mouseReleaseEvent,以便处理鼠标事件。
样式和外观:
可以通过设置 QPen 和 QBrush 来定义图形项的外观,包括边框和填充的颜色、样式等。
交互和动画:
由于 QGraphicsRectItem 是 QGraphicsItem 的子类,可以利用 Qt 提供的图形视图框架的功能,实现与用户的交互以及动画效果。
下面是一个简单的示例,演示了如何创建一个 QGraphicsRectItem 并将其添加到 QGraphicsScene 中:
#include
#include
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QGraphicsScene scene;
QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 50);
rectItem->setPos(50, 50); // 设置图形项在场景中的位置
scene.addItem(rectItem);
QGraphicsView view(&scene);
view.show();
return app.exec();
}
这个示例绘制了一个矩形,并将其添加到场景(画布)中,然后使用 QGraphicsView(窗体) 来显示场景。
也可以看我的另一篇文章《qt 坦克大战游戏 GUI绘制-CSDN博客》,介绍的是如何使用以上几种类,绘制一个简单的游戏,坦克大战中的坦克。