Qt学习-13 <QGraphicsView>

本文是关于Qt QGraphicsView的自学笔记。介绍了Graphics View框架,涉及场景类、视图类和图形项类;阐述了其坐标系,包括场景、视图和图形项坐标。还讲解了成员类型、属性成员、成员函数,并给出入门示例,同时提及堆与栈在程序和数据结构场景下的区别。

——  均为自学笔记,如有错误请指正


本文参考 QGraphicsView 、QGraphicsView

一、概述

1. 简介

        Graphics View框架实现了  模型-视图  结构的图形管理,能对大量图元进行管理,支持碰撞检测,坐标变换和图元组等多种方便的功能。

2. GraphicsView框架

在Graphics View绘图架构中,主要涉及到下面三个类的使用:

① 场景类(QGraphicsScene):该类提供绘图场景(Scene),场景是不可见的,是一个抽象的管理图形项的容器,可向场景中添加图形项,获取场景中的某个图形项等,主要功能如下:

  • 提供管理大量图元的快速接口;
  • 传播事件到场景中的每个图元;
  • 提供未经变换的渲染功能,主要用于打印;
  • 管理图元状态,如图元选择和焦点处理;

② 视图类(QGraphicsView):该类提供绘图的视图(View)组件,用于显示场景中的内容。可以为一个场景设置几个视图,用于对同一个数据集提供不同的观察方式;

③ 图形项类(QGraphicsItem):该类提供了一些基本的图形元件,也可在此基础上自定义图形项,它支持各种事件的响应,如鼠标事件、键盘事件、拖放事件等,以实现图形的交互功能,下面列举一些标准图元:

  • QGraphicsEllipseItem 椭圆
  • QGraphicsLineItem 直线
  • QGraphicsPathItem 路径
  • QGraphicsPixmapItem 图像
  • QGraphicsPolygonItem 多边形
  • QGraphicsRectItem 矩形
  • QGraphicsSimpleTextItem 简单文本
  • QGraphicsTextItem 文本浏览
  • QGraphicsItem是图元的基类,用户可以继承QGraphicsItem实现自定义的图元;
3. GraphicsView坐标系

        Graphics View基于笛卡尔坐标系。

        item在场景中的位置与几何形状通过x,y坐标来表示。当使用未经变形的视图来观察场景时,场景中的一个单位等于屏幕上的一个像素。在Graphics View绘图架构中涉及到了3个坐标系,即场景坐标、视图坐标及图形项坐标。

① 场景坐标:

        对应QPainter的逻辑坐标,以场景的中心为原点,X轴正方向向右,Y轴正方向向下;

② 视图坐标:

        即窗口界面的物理坐标,单位是像素,其左上角为原点坐标,所有鼠标事件、拖拽事件最开始都使用视图坐标,为了和图元交互,需要转换坐标为场景坐标;

③ 图形项坐标:

        图元存在于自己的本地坐标上,通常以图元的中心为原点,图元中心也是所有坐标变换的原点,图元坐标方向是X轴正方向向右,Y轴正方向向下(同上图)。

二、成员类型

1. QGraphicsScene

示例:

     QGraphicsScene scene;
     scene.addText("Hello, world!");
 
     QGraphicsView view(&scene);
     view.show();

视图可用于可视化整个场景,或仅可视化其中的一部分。

  • 默认情况下,在第一次显示视图时会自动检测可视化区域(通过调用 QGraphicsScene::itemsBoundingRect()   )。
  • 要自己设置可视化区域矩形,可以调用 setSceneRect()

这将适当地调整滚动条的范围。但是,尽管场景支持几乎无限大小,但滚动条的范围不会超过整数范围(INT_MIN、INT_MAX)。

QGraphicsView将鼠标和按键事件转化为场景事件,并转发到可视化的场景中,因此可以使用鼠标和键盘与场景中的项目进行交互。

2. QGraphicsView::CacheModeFlag

        视图的缓存模式。视图可以在 QPixmap 中缓存预渲染的内容,然后将其绘制到视口上。这种缓存的目的是加快渲染速度较慢的区域的总渲染时间。例如,纹理、渐变和 alpha 混合背景的渲染速度可能非常慢,尤其是转换后的视图。 每次转换视图时,缓存都会失效。滚动时,只需要部分失效。

  • CacheNone:不缓存,所有绘制都直接在视口上完成。
  • CacheBackground:启用缓存背景。
3.QGraphicsView::DragMode

        在试图上按下并拖动鼠标时视图的默认操作。

  • NoDrag:无拖拽,鼠标事件被忽略。
  • ScrollHandDrag:光标变为指向手型,拖动鼠标将滚动滚动条。 此模式在交互和非交互模式下均可使用。

  • RubberBandDrag:会出现一个橡皮筋框。拖动鼠标将设置橡皮筋框范围,所有被橡皮筋覆盖的项目都会被选中。对于非交互式视图禁用此模式。

4. QGraphicsView::OptimizationFlag:

        可以启用以提高视图渲染性能的标志。默认情况下,没有设置

<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>803</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>天气情况分析</string> </property> <widget class="QWidget" name="centralwidget"> <widget class="QTabWidget" name="tabWidget"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>801</width> <height>551</height> </rect> </property> <property name="styleSheet"> <string notr="true">background-color: qlineargradient(spread:pad, x1:0.484346, y1:1, x2:0.479, y2:0, stop:0 rgba(158, 214, 255, 255), stop:1 rgba(255, 255, 255, 255));</string> </property> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="tab"> <attribute name="title"> <string>数据预处理</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>选择与清洗</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="pushButton"> <property name="text"> <string>选择csv文件</string> </property> </widget> </item> <item> <widget class="QComboBox" name="comboBox"> <item> <property name="text"> <string>数值型列:使用KNNImputer填充缺失值</string> </property> </item> <item> <property name="text"> <string>非数值型列:使用该列的众数填充空值</string> </property> </item> <item> <property name="text"> <string>基于全部列删除重复项:使用drop_duplicates()方法删除所有重复的行</string> </property> </item> <item> <property name="text"> <string>异常值处理:使用IQR(四分位距)方法移除数据集数值型列中的异常值</string> </property> </item> <item> <property name="text"> <string>数据格式化和类型转换:对数值型列进行Min-Max归一化</string> </property> </item> <item> <property name="text"> <string>数据排序:根据索引排序</string> </property> </item> <item> <property name="text"> <string>数据存储:使用to_csv()方法将清洗后的数据存储到一个cleaned.csv文件中</string> </property> </item> </widget> </item> </layout> </widget> </item> <item> <widget class="QTableView" name="tableView"/> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>可视化</string> </attribute> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QGroupBox" name="groupBox_2"> <property name="title"> <string>可视化选项</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QPushButton" name="pushButton_2"> <property name="text"> <string>温度、气压、湿度随时间变化的折线图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_3"> <property name="text"> <string>不同站点PM2.5的柱状图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_4"> <property name="text"> <string>累积降水量·的面积图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_5"> <property name="text"> <string>各站点颗粒物浓度的散点图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_6"> <property name="text"> <string>气象玫瑰图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_7"> <property name="text"> <string>气象和污染物指标的雷达图</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_8"> <property name="text"> <string>箱线图展示数据分布</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGraphicsView" name="graphicsView"/> </item> </layout> </widget> <widget class="QWidget" name="tab_3"> <attribute name="title"> <string>算法建模</string> </attribute> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QGroupBox" name="groupBox_3"> <property name="title"> <string>算法选项</string> </property> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <widget class="QPushButton" name="pushButton_9"> <property name="text"> <string>线性回归</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_10"> <property name="text"> <string>移动平均</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_11"> <property name="text"> <string>时间序列分解</string> </property> </widget> </item> <item> <widget class="QPushButton" name="pushButton_12"> <property name="text"> <string>经典时间序列预测模型</string> </property> </widget> </item> </layout> </widget> </item> <item> <widget class="QGraphicsView" name="graphicsView_2"/> </item> </layout> </widget> </widget> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>803</width> <height>33</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui> 如果我要用网页实现上述ui文件的功能,怎么写python代码,已知要处理的cav文件有五万多行数据
06-30
### 数据预处理与后端开发 在将Qt UI功能转换为网页应用时,首先需要构建一个强大的后端来处理大型CSV文件。Python的Pandas库可以高效地读取和操作包含五万多行数据的CSV文件,同时结合Flask或Django框架实现Web服务[^1]。例如,使用Pandas进行数据清洗、缺失值填充和特征工程是常见的做法: ```python import pandas as pd # 读取CSV文件 df = pd.read_csv('large_data.csv') # 处理缺失值 df.fillna(0, inplace=True) # 特征编码(如分类变量) df = pd.get_dummies(df, columns=['category_column']) # 输出处理后的数据 df.to_csv('processed_data.csv', index=False) ``` 为了支持大规模数据集的操作,建议采用分块(chunking)方式读取数据,避免内存溢出问题: ```python chunksize = 10000 for chunk in pd.read_csv('large_data.csv', chunksize=chunksize): # 对每个数据块进行操作 processed_chunk = chunk.dropna() processed_chunk.to_csv('processed_data.csv', mode='a', index=False) ``` ### 前端可视化与交互设计 前端部分可采用React.js或Vue.js作为主要框架,通过API接口从后端获取处理好的数据并展示图表。Plotly.js 或者 Bokeh 提供了丰富的交互式可视化能力,适用于展示时间序列分析、分布图等复杂图形[^1]。 以下是一个简单的Flask API示例,用于向前端提供JSON格式的数据: ```python from flask import Flask, jsonify import pandas as pd app = Flask(__name__) @app.route('/data') def get_data(): df = pd.read_csv('processed_data.csv') return jsonify(df.to_dict(orient='records')) if __name__ == '__main__': app.run(debug=True) ``` 在前端,可以使用JavaScript Fetch API获取这些数据并绘制图表: ```javascript fetch('/data') .then(response => response.json()) .then(data => { Plotly.newPlot('chart', [{ x: data.map(d => d.date), y: data.map(d => d.value), type: 'scatter' }]); }); ``` ### 算法建模与部署 对于机器学习模型的集成,Scikit-learn 是首选工具之一。训练完成后,可以将模型保存为 `.pkl` 文件并通过 Flask/Django 提供预测服务: ```python from sklearn.ensemble import RandomForestRegressor import joblib # 训练模型 model = RandomForestRegressor() model.fit(X_train, y_train) # 保存模型 joblib.dump(model, 'model.pkl') ``` 创建一个预测接口: ```python from flask import request @app.route('/predict', methods=['POST']) def predict(): input_data = request.json prediction = model.predict([input_data['features']]) return jsonify({'prediction': prediction.tolist()}) ``` ### 性能优化与扩展性 当处理超大数据量时,仅依赖Pandas可能无法满足性能需求。此时可以考虑引入Dask或PySpark进行分布式计算,提升处理速度[^1]。此外,数据库如PostgreSQL或SQLite也可以用来存储和查询数据,减少每次请求时的I/O开销。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值