• QGraphicsView、QGraphicsScene、QGraphicsItem的应用


    思考:1.QGraphicsView、QGraphicsScene、QGraphicsItem的概念和联系 2.为什么要使用这种组合?3.如何使用? 4.怎么优化?

    1.QGraphicsView、QGraphicsScene、QGraphicsItem的概念和联系

    QGraphicsView

    可以展示QGraphicsScene内容的控件。`

    QGraphicsScene scene;
      scene.addText("Hello, world!");
    
      QGraphicsView view(&scene);//也可以使用setScene()
      view.show();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    QGraphicsScene

    QGraphicsScene 就像是给QGraphicsItem对象提供服务的容器。
    具有以下特点:
    1.快速管理大量的item对象
    2.传播事件中介
    3.管理item的状态,比如选中聚焦等等。

    QGraphicsItem

    QGraphicsItem是最基本的对象,它有几种派生类:
    QGraphicsEllipseItem provides an ellipse item
    QGraphicsLineItem provides a line item
    QGraphicsPathItem provides an arbitrary path item
    QGraphicsPixmapItem provides a pixmap item
    QGraphicsPolygonItem provides a polygon item
    QGraphicsRectItem provides a rectangular item
    QGraphicsSimpleTextItem provides a simple text label item
    QGraphicsTextItem provides an advanced text browser item
    也可以自定义类:

    class DectorItem : public QObject,public QGraphicsItem
    {
    	Q_OBJECT
    	Q_INTERFACES(QGraphicsItem)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.为什么要使用这种组合?

    1.可以用鼠标和键盘对QGraphicsItem进行交互。
    2.自带旋转、平移、缩放和剪切功能。
    3.打印QGraphicsScene ,生成图片

    4.怎么优化?

    1.创建QGraphicsView的子类,重新实现鼠标和键盘按钮事件处理函数(句柄)。
    2.使用映射函数mapToScene() and mapFromScene(),item访问函数items() and itemAt(),从而可以控制points, rectangles, polygons and paths的视图坐标系和场景坐标系的转换。换言之,可以通过view coordinates来获取具体的items。

    DectorGraphicsView::DectorGraphicsView(QWidget *parent)
    	: QGraphicsView(parent)
    {
    	this->thisInit();
    	this->thisSlot();
    }
    
    DectorGraphicsView::~DectorGraphicsView()
    {
    }
    
    void DectorGraphicsView::thisInit() {
    	m_xPos = m_yPos = -1000;
    
    	this->m_scene = new QGraphicsScene(this);
    	this->m_scene->setItemIndexMethod(QGraphicsScene::NoIndex);//显示更快
    	this->setScene(this->m_scene);
    
    	this->setCacheMode(CacheBackground);//缓存背景,显示更快
    	this->setViewportUpdateMode(FullViewportUpdate);//全部视口更新,显示更快
    	this->setRenderHint(QPainter::Antialiasing);
    	this->setTransformationAnchor(AnchorUnderMouse);//变换的时候场景的位置
    
    	this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 这里很重要,否则坐标对不准
    	this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    	this->scale(1.000000000000, 1.000000000000);
    	this->setAcceptDrops(true);  //可拖拉
    	this->viewport()->setStyleSheet("background:transparent;");
    	this->setStyleSheet("QGraphicsView { background:rgb(18,96,151);}");
    
    	m_xLineItem = new DectorPosLineItem(LineDirectionS::XLineS);
    	m_yLineItem = new DectorPosLineItem(LineDirectionS::YLineS);
    	m_xLineItem->setZValue(1);
    	m_yLineItem->setZValue(1);
    	this->m_scene->addItem(m_xLineItem);
    	this->m_scene->addItem(m_yLineItem);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    树莓派i2c通讯 设置 和 查看 i2c通信地址方法
    【RTOS训练营】环形缓冲区、AT指令、预习安排和晚课提问
    Selenium基础
    模型资源加载引起的内存对齐问题
    Python-数据结构-集合
    Java集合(四) --- Map
    Shell 函数
    LeetCode_266_回文排列
    spring boot破解xjar.go加密后的jar包
    前端 JS 经典:typeof 和 instanceof 区别
  • 原文地址:https://blog.csdn.net/bin_bang/article/details/125488244