Qt的Graphics/View框架

        Qt的GraphicsNiew框架被用来存放、显示二维图形元素,处理那些对图形元素进行操 作的交互命令。
        本文仅仅简要介绍一下框架的基本内容和一些Qt绘图知识。
      (1)Qt应用程序的图形界面包含各种控件,比如窗口、按钮、滚动条等。所有这些控件对象 都具有一个共同的基类QWidget。一个QWidget对象是构成图形界面的基本单位。它能够在 屏幕上绘制自己,能够处理鼠标、键盘事件。控件所占的屏幕区域总是矩形的。在屏幕上显 示多个控件时会按照一定的顺序逐个显示。我们称先被显示的控件位于“底层”,后被显示 的位于“顶层”。当多个控件所占区域重叠时,顶层控件会遮挡底层控件。
        控件之间可以形成父子关系,比如对于一个对话框,其中的按钮、滚动 条等为子控件,对话框为父控件。子控件常常作为父控件的数据成员出现,所以我们也称一 个父控件包含一个子控件,或者一个子控件被嵌入到一个父控件中。大部分控件都作为子控 件出现,没有父控件的控件被称为窗口。通常,一个窗口的四周具有边框,其顶部具有一个 标题。Qt的QMainWindow以及QDialog是常用的窗口控件。父控件的尺寸较大,子控件的 尺寸较小。当子控件的部分或者全部落在父控件区域之外时,只有位于父控件区域之内的部 分才会被绘制。一个图形界面由多个控件层叠而成,父控件位于底层,而子控件位于顶层。 Qt总会先绘制底层的控件再绘制顶层的控件,以形成层叠效果.
        绘制一个几何图形需要做两方面工作。
        (1)计算该图形中每个像素的坐标位置。比如在输出设备上绘制一个线段时,由于输出设备的分辨率是有限的。我们 只需要计算该 线段上有限个点的坐标比如起点、终点等。然后类QPainter负责完成此项任务。
        (2)将计算出来的轨迹输出到特定设备,比如屏幕或者打印机,类QPainterDevice表示 这些设备。
       我们通常使用QPainter的构造函数QPainter ( QPaintDevice*device)构造一个对象, 调用该对象的图形绘制函数,即可在参数device所指的设备上绘制图形。QPainter提供了丰 富的图形绘制函数,经常使用的图形绘制函数如下。drawLine(), drawPolyline()和drawArc()  分别绘制直线、折线、曲线,drawRect(),  drawEllipse(),  drawPolygon(),  drawPie()分别绘制 矩形、椭圆、多边形、馅饼形。绘制前,我们可以调用setPen()设定线宽、线的颜色等参数。 如果被绘制的图形是封闭的,图形内部将被填充。函数setBrush()设置填充颜色、填充模式等。 为了输出文字,可以调用drawText(),而setFont()可以设置字体、字号等。
        (2)Graphics/View框架        
       该框架包含3个核心类:QGraphicsItem,QgraphicsScene, QGraphicsView。
        QGraphicsItem 表示被显示的图形元素。QGraphicsScene表示囊括了所有图形元素的场景。该类只表示一个 场景由哪些图形元素组成,并不负责显示其中的元素。
       QGraphicsView负责显示一个场景中 的部分或者全部图形元素。一个场景可以对应多个QGraphicsView对象,以显示一个场景的 不同区域,或者以不同的方式来显示该场景。
        QGraphiclView框架还处理那些对图形元素进行操作的交互命令。例如,当用户单击左键、 试图选择某个图形元素时,QGraphicsView将鼠标坐标换算为QGraphicsScene的坐标,遍历 各个QGraphicsItem对象,判断哪个图形元素被单击。        
         QGraphicsScene维护一个列表,记录哪些图形元素被选中。另外它还维护一个数据结 构,记录哪个或者哪些图形元素获得聚焦 用户的键盘事件经由QGraphicsView传递给 QGraphicsScene,后者将键盘事件传递给获得聚焦的图形元素。
        说明:每个图形元素( QGraphicsItem对 象)和 所有图形元素组成 的场景(QGraphicsScene对象)都拥有自己的坐标系, 可以自由选择原点位置,坐标值具有 浮点精度,与显示设备无关。 每个视图(QGraphicsView对象)也拥有自己的坐标系。 然而这个坐标系与 具体显示 设备(比如屏幕)密切相关, 任何一个显示设备的分辨率都是有限的,因而坐标值只能 是整数,不能是浮点数。
        特例:
        场景中的图形元素在二维空间上可能发生部分或者全部重叠,称为图形元素之间的碰撞。 撞的检测是由QGraphicsScene和QGraphicsItem协作完成的。QGraphicsItem有一个虚函数 shape(),负责返回其自身的轮廓。
重载虚函数shape(),返回图形元素的精确外形。

QPainterPath RoundItem::shape()const

{
    QPainterPath path;
    path.addRect(0,0,10,20);
    return path;
}
QGraphicsScene的成员函数collidingItems()负责查询场景中每个图形元素的轮廓,判断哪些元素和某个指定的元素相撞。
   painter->setBrush(scene()->collidingItems(this).isEmpty() ? Qt::darkYellow : Qt::red);
  
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页