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

4.Key Features(主要特征)

注:这篇是学弟帮忙写的,很感谢他。

4.1 缩放和旋转(Zooming and rotating)

QGraphicsView 支持与QPainter功能相同的仿射变换

QGraphicsView::setMatrix(). 通过对视图应用变换,您可以轻松添加对常见导航功能(如缩放和旋转)的支持。

这里是一个关于如何在QGraphicsView的子类中实现缩放和旋转插槽的示例:

1
2
3
4
5
6
7
8
9
10
11
class  View :  public  QGraphicsView
{
Q_OBJECT
     ...
public  slots:
     void  zoomIn() { scale(1.2, 1.2); }
     void  zoomOut() { scale(1 / 1.2, 1 / 1.2); }
     void  rotateLeft() { rotate(-10); }
     void  rotateRight() { rotate(10); }
     ...
};

插槽可以连接到QToolButtons,并启用autoRepeat。

当转换视图时,QGraphicsView会保持视图的中心对齐。

有关显示如何实现基本缩放功能的代码,另请参阅弹性节点(Elastic Nodes)示例。


4.2 绘图(Printing)

图形视图通过其渲染函数QGraphicsScene::render() 和QGraphicsView::render()提供单行打印的功能。 这些函数提供相同的API:通过将QPainter传递到任何一个渲染函数,您可以让场景或视图将所有或部分内容渲染到任何绘图设备中。

此示例显示如何使用QPrinter将整个场景打印至完整页面中。

1
2
3
4
5
6
7
8
9
QGraphicsScene scene;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
 
QPrinter printer;
if  (QPrintDialog(&printer).exec() == QDialog::Accepted) {
     QPainter painter(&printer);
     painter.setRenderHint(QPainter::Antialiasing);
     scene.render(&painter);
}

场景和视图呈现功能之间的差别在于,一个在场景坐标中操作,另一个在视图坐标中操作。QGraphicsView::render()通常优选用于打印未转换的场景的整个段,例如用于绘制几何数据或用于打印文本文档。而 QGraphicsScene::render()适合截取屏幕截图,它的默认行为是使用提供的绘图器渲染视口的确切内容。

1
2
3
4
5
6
7
8
9
10
QGraphicsScene scene;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
 
QPixmap pixmap;
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
painter.end();
 
pixmap.save( "scene.png" );

当源和目标区域的大小不匹配时,源内容会被拉伸以适合目标区域。将Qt::AspectRatioMode(横纵比模式)调用到您正在使用的渲染函数中,可以调整场景的宽高比,也可以选择保持或忽略更改。

4.3 拖放(Drag and Drop)

因为QGraphicsView间接继承QWidget,它已经提供了与QWidget相同的拖放功能。 此外,为了方便起见,图形视图框架为场景以及每个项目提供拖放支持。当视图接收到拖动命令时,它将拖放事件转换为QGraphicsSceneDragDropEvent,然后将其转发到场景。 场景接管此事件的调度,并将其发送到鼠标光标下的第一个项目完成放置。

要从项目中启动拖动,请创建QDrag对象,将指针传递到启动拖动的小部件。项目可以同时通过许多视图观察到,但只有一个视图可以启动拖动。在大多数情况下,拖动是由于按下或移动鼠标而启动的,因此在mousePressEvent()或mouseMoveEvent()中,您可以从事件中获取控件指针。 例如:

1
2
3
4
5
6
7
8
9
void  CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
     QMimeData *data =  new  QMimeData;
     data->setColor(Qt::green);
 
     QDrag *drag =  new  QDrag(event->widget());
     drag->setMimeData(data);
     drag->start();
}

要中断场景的拖放事件,您需要在QGraphicsItem子类中重新实现QGraphicsScene::dragEnterEvent() 或其他特定场景所需的事件处理程序。在QGraphicsScene的事件处理程序的文档中,您可以阅读有关拖放图形视图的更多信息。

调用QGraphicsItem::setAcceptDrops()可以使项目启用拖放支持。要处理传入的拖动命令,要重新实现QGraphicsItem::dragEnterEvent(), QGraphicsItem::dragMoveEvent(), QGraphicsItem::dragLeaveEvent(),和 QGraphicsItem::dropEvent()。

另请参见拖放机器人示例Drag and Drop Robot,示例演示了图形视图对拖放操作的支持。

4.4 光标和工具提示(Cursors and Tooltips)


 QWidgetQGraphicsItem 也支持光标(QGraphicsItem::setCursor())和工具提示(QGraphicsItem::setToolTip())。当鼠标光标进入项目的区域时(通过调用QGraphicsItem::contains()检测),光标和工具提示被QGraphicsView功能激活。


您还可以通过调用QGraphicsView::setCursor()直接在视图上设置默认光标。


有关实现工具提示和游标形状处理的代码,请参阅拖放机器人示例Drag and Drop Robot 

4.5 动画(Animation)

图形视图支持若干等级的动画。您可以使用动画框架轻松制作动画。为此,你需要让你的项目继承QGraphicsObject功能并关联QPropertyAnimation功能。QPropertyAnimation允许赋予任何QObject属性。

另一个选项是创建一个继承自QObject和QGraphicsItem的自定义项。 该项可以设置自己的计时器,并使用QObject::timerEvent()中的增量步骤来控制动画,

第三个选项,主要用于与Qt 3中的QCanvas兼容,是通过调用QGraphicsScene::advance()推进场景,这其中又调用了QGraphicsItem::advance()。

4.6 OpenGL渲染(OpenGL Rendering)

要启用OpenGL渲染,您只需通过调用QGraphicsView::setViewport()设置一个新的QGLWidget作为QGraphicsView的视口。 如果你想要带有抗锯齿的OpenGL,你需要OpenGL样本缓冲区支持(参见QGLFormat::sampleBuffers())。

示例:

1
2
QGraphicsView view(&scene);
view.setViewport( new  QGLWidget(QGLFormat(QGL::SampleBuffers)));

4.7 项目组(Item Groups)

您可以把一个项目赋为另一个项目的子项来实现项目分组的最基本的功能:操作后的父子项目将可以同时移动,并且所有变换会从父项传播到子项。

此外,QGraphicsItemGroup是一个联结了子项目的特殊项目,用于处理一个实用的接口,从组中添加和删除项目。 将项目添加到QGraphicsItemGroup将保持项目的原始位置和转换形态,而将项目重新赋予父项目一般会导致该子项目重新定位,与新的父项目联结。 为了方便起见,您可以通过调用QGraphicsScene::createItemGroup()来创建QGraphicsItemGroups

4.8 窗口小部件和布局(Widgets and Layouts)

Qt 4.4通过QGraphicsWidget引入了对几何和布局感知项目的支持。 这个特殊的基础项目类似于QWidget,仅有的不同点是它不继承于QPaintDevice;,而是继承于QGraphicsItem。这样的好处是允许您编写具有事件、信号和插槽,大小提示和策略的完整小部件,并且还可以通过QGraphicsLinearLayout和QGraphicsGridLayout来管理小部件的几何布局。

4.8.1 QGraphicsWidget

QGraphicsWidget是基于QGraphicsItem的功能和精简脚本,提供了两个方面的最佳功能:QWidget的额外功能,如风格、字体、调色板、布局方向、几何特征、分辨率独立性和从QGraphicsItem的转换支持。因为图形视图使用真实坐标而不是整数,QGraphicsWidget的几何函数也会对QRectFQPointF进行操作。这也适用于框架矩形、边距和间距。在使用QGraphicsWidget过程中指定类似(0.5,0.5,0.5,0.5)的内容边距并不罕见。您可以创建子窗口小部件和“顶级”窗口。在某些情况下,您现在可以使用图形视图进行高级MDI应用程序开发。

支持一些QWidget的属性,包括窗口标志和属性,但不是全部。你应该参考QGraphicsWidget的类文档,来了解它支持或不支持哪些功能。例如,您可以通过将Qt::Window窗口标志传递给QGraphicsWidget的构造函数来创建装饰窗口,但图形视图目前不支持在macOS上常见的Qt::Sheet和Qt::Drawer标志。


相关文章:

  • 5.Performance(性能)
  • linux解决wifi问题
  • 比较C++中数组,vector,array
  • 一、opencv的图像基本读写
  • 二、opencv的滑块使用
  • 三、Mat类的使用
  • 四、常用数据结构和函数
  • 五、颜色空间缩减
  • 2017.5.5
  • ubuntu安装QT5.7
  • QT 语法知识
  • Qt Creator 使用tips
  • C++使用tips
  • QT布局和ui简单使用
  • QWidget关系图及部件
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Codepen 每日精选(2018-3-25)
  • JavaWeb(学习笔记二)
  • leetcode讲解--894. All Possible Full Binary Trees
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • linux安装openssl、swoole等扩展的具体步骤
  • Phpstorm怎样批量删除空行?
  • python3 使用 asyncio 代替线程
  • Shadow DOM 内部构造及如何构建独立组件
  • Spark RDD学习: aggregate函数
  • vue 个人积累(使用工具,组件)
  • 从PHP迁移至Golang - 基础篇
  • 复习Javascript专题(四):js中的深浅拷贝
  • 后端_MYSQL
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 优化 Vue 项目编译文件大小
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (NSDate) 时间 (time )比较
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (动态规划)5. 最长回文子串 java解决
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (算法)求1到1亿间的质数或素数
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)LINQ之路
  • .gitignore文件_Git:.gitignore
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net 高效开发之不可错过的实用工具
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET程序员迈向卓越的必由之路
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [.net]官方水晶报表的使用以演示下载
  • [20150707]外部表与rowid.txt
  • [AIGC] SQL中的数据添加和操作:数据类型介绍