当前位置: 首页 > news >正文

QGraphicsView类介绍

一、QGraphicsView类 简介

QGraphicsView 是 Qt 中的一个重要的类,用于显示 QGraphicsScene 中的内容。它提供了一个窗口小部件(widget),该窗口小部件可以用来查看和与 QGraphicsScene 中的对象进行交互。下面是关于 QGraphicsView 的详细介绍:

基本概念

  • QGraphicsScene:这是 QGraphicsView 显示的内容。QGraphicsScene 包含一组 QGraphicsItem 对象,并定义了它们的位置和关系。

  • QGraphicsView:这是一个窗口小部件,它包含了 QGraphicsScene 并提供了视图来显示场景中的内容。它可以包含滚动条、缩放和平移等功能。

  • QGraphicsItem:这是场景中的基本图形对象。它可以是任何形状,例如矩形、线条、文本等,并且可以具有子项形成一个层次结构。

功能特性

  1. 显示和渲染QGraphicsView 负责渲染 QGraphicsScene 中的所有图形项,并将它们显示在屏幕上。

  2. 滚动和缩放QGraphicsView 提供了滚动和缩放的功能,允许用户查看场景中的不同部分,并调整视图的细节程度。

  3. 交互性QGraphicsView 支持鼠标和键盘事件,使得用户能够与场景中的图形项进行交互,比如选择、移动、放大和缩小等。

  4. 自定义渲染:可以通过重写 QGraphicsView 的方法来定制渲染行为,例如 drawBackground()drawForeground()drawFrame() 方法。

常用方法

  • 设置场景:使用 setScene(QGraphicsScene *) 方法将一个 QGraphicsScene 设置给 QGraphicsView

  • 获取场景:使用 scene() 方法来获取当前的 QGraphicsScene

  • 滚动条:通过 horizontalScrollBar()verticalScrollBar() 获取水平和垂直滚动条。

  • 缩放scale(qreal sx, qreal sy) 用于缩放视图;zoomIn()zoomOut() 用于增加和减少缩放比例。

  • 平移translate(qreal dx, qreal dy) 方法用于平移视图。

  • 中心点centerOn(const QPointF &point)centerOn(qreal x, qreal y) 用于将视图的中心移动到指定位置。

示例代码

下面是一个简单的例子,展示如何使用 QGraphicsViewQGraphicsScene

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建一个 QGraphicsSceneQGraphicsScene scene;scene.setSceneRect(0, 0, 400, 300);  // 设置场景大小// 在场景中添加一个红色矩形QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 100);rect->setBrush(Qt::red);scene.addItem(rect);// 创建一个 QGraphicsViewQGraphicsView view(&scene);view.setRenderHint(QPainter::Antialiasing);  // 启用抗锯齿view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);  // 更新模式view.setBackgroundBrush(Qt::lightGray);  // 设置背景色view.show();return app.exec();
}

总结

QGraphicsView 提供了一个强大的工具集来管理和显示复杂的二维图形界面。它不仅提供了基本的视图功能,还支持高级的交互和渲染特性。通过结合 QGraphicsSceneQGraphicsItem,你可以创建出高度定制化的图形界面。

二、QGraphicsView 类关键方法

QGraphicsView 类提供了几个关键的方法,允许开发者定制视图的渲染行为。这些方法主要用于在渲染场景之前或之后添加额外的视觉元素或者改变默认的行为。下面是一些常用的方法以及如何使用它们来进行定制:

1. drawBackground(QPainter *painter, const QRectF &rect)

这个方法用于在场景的背景上绘制额外的图形。当视图需要重新绘制时,会调用此方法。

用法示例:
void MyView::drawBackground(QPainter *painter, const QRectF &rect)
{// 调用基类实现QGraphicsView::drawBackground(painter, rect);// 在背景上绘制网格painter->setPen(QPen(Qt::gray, 0.5, Qt::DotLine));int gridStep = 20;for (int x = rect.left(); x <= rect.right(); x += gridStep)painter->drawLine(x, rect.top(), x, rect.bottom());for (int y = rect.top(); y <= rect.bottom(); y += gridStep)painter->drawLine(rect.left(), y, rect.right(), y);
}

2. drawForeground(QPainter *painter, const QRectF &rect)

这个方法用于在所有场景项之上绘制额外的图形。这通常用于绘制辅助线或其他覆盖在场景顶部的信息。

用法示例:
void MyView::drawForeground(QPainter *painter, const QRectF &rect)
{// 绘制一些指示箭头或者其他覆盖元素painter->setPen(QPen(Qt::blue, 2));painter->drawLine(rect.center().x(), rect.top(), rect.center().x(), rect.bottom());painter->drawLine(rect.left(), rect.center().y(), rect.right(), rect.center().y());
}

3. drawFrame()

如果视图的样式设置了框架,那么此方法会在视图周围绘制一个边框。这个方法在视图的框架被绘制之前被调用。

用法示例:
void MyView::drawFrame(QPainter *painter)
{// 调用基类实现QGraphicsView::drawFrame(painter);// 添加额外的边框效果painter->setPen(QPen(Qt::darkGreen, 3));painter->drawRect(rect());
}

注意事项

  • 当重写这些方法时,通常需要先调用基类的实现以保持默认的行为。
  • 使用这些方法时要确保只绘制在传入的 rect 内,以避免不必要的绘制开销。

其他相关方法

除了上述三个主要方法之外,还有一些其他方法可以用来控制视图的渲染行为:

  • viewportEvent(QEvent *event): 可以用来处理特定的视口事件。
  • resizeEvent(QResizeEvent *event): 重写此方法可以对视口大小变化做出反应。
  • wheelEvent(QWheelEvent *event): 可以用来处理滚轮事件,例如用于缩放。

示例代码

这里有一个完整的示例,展示了如何创建一个带有定制渲染行为的 QGraphicsView

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QPainter>class CustomView : public QGraphicsView
{Q_OBJECT
public:CustomView(QWidget *parent = nullptr) : QGraphicsView(parent) {}protected:void drawBackground(QPainter *painter, const QRectF &rect) override;void drawForeground(QPainter *painter, const QRectF &rect) override;void drawFrame(QPainter *painter) override;
};void CustomView::drawBackground(QPainter *painter, const QRectF &rect)
{QGraphicsView::drawBackground(painter, rect);painter->setPen(QPen(Qt::gray, 0.5, Qt::DotLine));int gridStep = 20;for (int x = rect.left(); x <= rect.right(); x += gridStep)painter->drawLine(x, rect.top(), x, rect.bottom());for (int y = rect.top(); y <= rect.bottom(); y += gridStep)painter->drawLine(rect.left(), y, rect.right(), y);
}void CustomView::drawForeground(QPainter *painter, const QRectF &rect)
{painter->setPen(QPen(Qt::blue, 2));painter->drawLine(rect.center().x(), rect.top(), rect.center().x(), rect.bottom());painter->drawLine(rect.left(), rect.center().y(), rect.right(), rect.center().y());
}void CustomView::drawFrame(QPainter *painter)
{QGraphicsView::drawFrame(painter);painter->setPen(QPen(Qt::darkGreen, 3));painter->drawRect(rect());
}int main(int argc, char *argv[])
{QApplication app(argc, argv);QGraphicsScene scene;scene.setSceneRect(0, 0, 400, 300);QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 100);rect->setBrush(Qt::red);scene.addItem(rect);CustomView view(&scene);view.setRenderHint(QPainter::Antialiasing);view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);view.setBackgroundBrush(Qt::lightGray);view.show();return app.exec();
}

这个示例创建了一个带有网格背景、中心指示线和额外边框的自定义视图。通过重写 drawBackground(), drawForeground(), 和 drawFrame() 方法,可以轻松地实现这些定制化需求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 推荐一款好用的mac解压缩软件
  • 编写bash脚本:读取URL,每隔5分钟运行一次‘git clone ‘ URL,直至运行成功。
  • 一步步理解 Python 异步生成器(AsyncGenerator)——从入门到实践
  • centos安装websocat
  • 【算法基础实验】图论-Dijkstra最短路径
  • springboot-从0开始创建一个starter
  • JWT-JSON Web Token
  • Marching Cubes 算法三探
  • 「对比评测」标准WPF DataGrid与DevExpress WPF GridControl有何不同?(一)
  • 微信删除了好友如何恢复?试试这3种方法,赶紧收藏!shuju
  • 谈到这个痛点,写C的和不写C的码农都沉默了
  • Celery 中,广播模式可以通过使用 RabbitMQ 的 fanout 交换机来实现
  • MFC工控项目实例之七点击下拉菜单弹出对话框
  • WHAT - 通过 react-use 源码学习 React(State 篇)
  • 打卡52天------图论(应用题)
  • 【Leetcode】101. 对称二叉树
  • 【译】理解JavaScript:new 关键字
  • Angular4 模板式表单用法以及验证
  • IOS评论框不贴底(ios12新bug)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java小白进阶笔记(3)-初级面向对象
  • JWT究竟是什么呢?
  • Netty源码解析1-Buffer
  • node 版本过低
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React-生命周期杂记
  • Spark RDD学习: aggregate函数
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 欢迎参加第二届中国游戏开发者大会
  • 一文看透浏览器架构
  • 云大使推广中的常见热门问题
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # 飞书APP集成平台-数字化落地
  • (0)Nginx 功能特性
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (独孤九剑)--文件系统
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (万字长文)Spring的核心知识尽揽其中
  • (译) 函数式 JS #1:简介
  • (转)Unity3DUnity3D在android下调试
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Async 异步注解使用
  • @javax.ws.rs Webservice注解
  • @JsonFormat与@DateTimeFormat注解的使用
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [10] CUDA程序性能的提升 与 流
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BJDCTF2020]The mystery of ip