使用QPushButton、QLabel、QCheckBox等构成GUI的控件或自定义图形时,开发应用程序会变得很简单。
但是如果想在GUI中使用数十个或者数百个图形对象,向用户完美展示控制场景,则会受到很多的限制。

   使用Qt图形视图框架用来管理2D图形项,支持绘制、缩放、事件响应等等。
    1、快速提供并管理大量对象    

    2、将事件传递到每一个对象

    3、管理焦点处理或对象选择等状态

  在需要大量图元绘制时为什么要使用Qt的图形试图框架呢?因为效率高!那为什么效率高,效率又有多高呢?

    答案就是QGraphicsView框架通过二元空间划分树(Binary Space Partitioning,BSP)提供快速的图元查找,这样就能够实时地显示包含上百万个图元的大场景了。

  在Qt图形视图中起主要作用的3个类:,分别是QGraphicsView(视图),QGraphicsSence(场景),QGraphicsItem(图元);

    QGraphicsView   :  间接继承于QWidget,既然是继承于Ui类。

    QGraphicsSence:一个用来容纳图元的容器。

    QGraphicsItem   :  所有图元的基类。

    三者关系:QGraphicsItem是图形的抽象;QGraphicsSence用来容纳QGraphicsItem对象的容器,但是无法显示图元,只有依赖QGraphicsView才能显示图元。

  下面代码以一个最简单的例子来演示三者之间的关系:

蝴蝶飞舞 
#include <QApplication>
#include "butterfly.h"
#include <QGraphicsScene> #if 0
结构总结:
①继承QGraphicsItem生成了一个可自我维护的图元。
②生成场景,设置场景大小。
③生成QGraphicsView用于对场景进行显示。
#endif int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene *scene = new QGraphicsScene;
//确定scene的大小 四个参数依次是:x起点,y起点 长度 宽度
scene->setSceneRect(QRectF(-,-,,)); //继承于QGraphicsItem
Butterfly *butterfly = new Butterfly;
butterfly->setPos(-,); scene->addItem(butterfly); QGraphicsView *view = new QGraphicsView;
view->setScene(scene);
view->resize(,);
view->show(); return a.exec();
}
butterfly.h
#ifndef BUTTERFLY_H
#define BUTTERFLY_H #include <QObject>
#include <QGraphicsItem>
#include <QPainter>
#include <QGraphicsScene>
#include <QGraphicsView> class Butterfly : public QObject,public QGraphicsItem
{
Q_OBJECT
public:
explicit Butterfly(QObject *parent = );
//一个被重写的虚函数,可以使用startTimer(100)启动
void timerEvent(QTimerEvent *);
QRectF boundingRect() const; signals: public slots:
protected:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private:
bool up;
QPixmap pix_up; //用于表示两幅蝴蝶的图片
QPixmap pix_down; qreal angle;
}; #endif // BUTTERFLY_H

 

butterfly.cpp
#include "butterfly.h"
#include <math.h> const static double PI=3.1416; Butterfly::Butterfly(QObject *parent) :
QObject(parent)
{
up = true;
pix_up.load(":/up.png");
pix_down.load(":/down.png"); startTimer();
} QRectF Butterfly::boundingRect() const
{
qreal adjust =;
return QRectF(-pix_up.width()/-adjust,-pix_up.height()/-adjust,pix_up.width()+adjust*,pix_up.height()+adjust*);
} void Butterfly::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
if(up)
{
painter->drawPixmap(boundingRect().topLeft(),pix_up);
up=!up;
}
else
{
painter->drawPixmap(boundingRect().topLeft(),pix_down);
up=!up;
}
} void Butterfly::timerEvent(QTimerEvent *)
{
//边界控制
qreal edgex=scene()->sceneRect().right()+boundingRect().width()/;
qreal edgetop=scene()->sceneRect().top()+boundingRect().height()/;
qreal edgebottom=scene()->sceneRect().bottom()+boundingRect(). height()/; if(pos().x()>=edgex)
setPos(scene()->sceneRect().left(),pos().y());
if(pos().y()<=edgetop)
setPos(pos().x(),scene()->sceneRect().bottom());
if(pos().y()>=edgebottom)
setPos(pos().x(),scene()->sceneRect().top()); angle+=(qrand()%)/20.0;
qreal dx=fabs(sin(angle*PI)*10.0);
qreal dy=(qrand()%)-10.0; setPos(mapToParent(dx,dy));
}
 

    


Qt-MVC图形视图框架初识的更多相关文章

  1. Qt之图形视图框架

    简述 图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元. 框架包括一个事件传播架构,支 ...

  2. 用Qt图形视图框架开发拼图游戏

    用Qt的图形视图框架(Graphics View Framework)做了一个拼图游戏DEMO,演示了: QGraphicsView.QGraphicsScene.QGraphicsItem的基本用法 ...

  3. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

    前话   Qt的图形视图框架,最核心的三个类为:QGraphicsScene.QGraphicsItem与QGraphicsView.   基于图形框架的高级白板软件Demo QGraphicsSce ...

  4. QT 图形视图框架

    https://blog.csdn.net/qq769651718/article/details/79357936 使用QPushButton.QLabel.QCheckBox等构成GUI的控件或自 ...

  5. Qt图形视图框架公开课资料

    接受CSDN学院的邀请,讲一次公开课,主题是Qt图形视图框架,报名链接在这里:http://edu.csdn.net/huiyiCourse/detail/228. 内容有两部分:自定义Item和拖放 ...

  6. Qt 2D绘图之六:图形视图框架的事件处理与传播

    一.简介 图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景传递给相应的图形项.而对于键盘事件,它会传递给获得焦点的图形项,可以使用QGraphicsScene类的setFocusI ...

  7. Qt 2D绘图之五:图形视图框架的结构和坐标系统

    一.图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们.但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动.检测它们的碰撞和叠加:或者我们想让自己绘制的图 ...

  8. Qt开发技术:图形视图框架(一)基本介绍

    前话   使用到Qt的视图框架.   Qt视图框架介绍 简介   图形视图框架(The Graphic View Framework)用于管理和与大量定制的二维图形项目交互,以及用于可视化项目的视图小 ...

  9. Qt-MVC图形视图框架分解

    前面在<Qt-MVC图形视图框架出识>中我们了解了Qt图形视图框架中三个最基本的类,弄清他们的关系,本片小文,我们将对QGraphicsView,QGraphiceScene,QGraph ...

随机推荐

  1. 在mac下搭建Apacheserver

    Apache作为最流行的Webserver端软件之中的一个.它的长处与地位不言而喻.以下介绍下在mac下搭建Apacheserver的步骤: (1)"前往" –>" ...

  2. 什么是 AQS ?

    1.什么是AQS? AQS是英文单词AbstractQueuedSynchronizer的缩写,翻译过来就是队列同步器. 它是构建锁或者其他同步组件的基础框架(如ReentrantLock.Reent ...

  3. VCL里的构造函数

    好奇,为什么Create函数明明是个构造函数,还要带上override;这是C++里没有的事情.我虽然也明白其大致的作用和目的,但还是没有见到官方和权威的说法.如果哪位大大见到此文,还望给一个详细一点 ...

  4. js 单例模式的实现方式----闭包和构造函数内部判断

    闭包: var singleton = function( fn ){ var result; return function(){ return result || ( result = fn .a ...

  5. java web service

    1.编写服务代码 服务代码提供了两个函数,分别为sayHello和sayHelloToPerson,源代码如下: /* * File name: HelloService.java * * Versi ...

  6. failed to load AppCompat ActionBar with unkNown error

    解决办法: 在AndroidManifest.xml文件中找到 全局样式文件 Theme,如图: 进入到这个文件,在前面增加 "Base".,如图:

  7. Oracle序列更新

    Oracle 数据库的时候,有时候会选择使用自增序列作为主键.但是在开发过程中往往会遇到一些不规范的操作,导致表的主键值不是使用序列插入的.这样在数据移植的时候就会出现各种各样的问题.当然数据库主键不 ...

  8. android RefBase、sp、wp

    首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似 这个类中存在一个私有成员: weakref_impl* const mRefs;(weakr ...

  9. HTML初级教程 表单form

    表单本身是没有什么用的.这需要编一个程序来处理输入表单中的数据.这也超出了本站指南的范围.如果使用网络服务器来放置HTML,你能够自助地找到一些简单的教程,开发一个服务器端的程序使一个发送到Email ...

  10. Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

    一.Android 低功耗蓝牙(BLE)的API简介 从Android 4.3(API 18)才支持低功耗蓝牙(Bluetooth Low Energy, BLE)的核心功能, BLE蓝牙协议是GAT ...