QGraphicsView 框架学习(四),Undo Redo

QT学习:图形视图Graphics View 一、Graphics View框架结构的主要特点 (1)在Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。 (2) Graphics View支持事件传播体系结构,可以使图元在场景(scene) 中的交互能力提高1倍,图元能够处理键盘事件和鼠标事件。其中,鼠标事件包括鼠标被按下、移动、释放和双击,还可以跟踪鼠标的移动。 (3)在Graphics View框架中,通过二元空间划分树(Binary Space Pritining, BSP) 提供快速的图元 阅读详情

撤销,重做,任何编辑器的必备工具。还是Qt的提供的标准解决方案。

QUndoCommand;QUndoStack;QUndoView;

图形编辑的每一个动作都应该有相应的撤销和重做机制。我们为每个动作派生一个对象。

Qt demo里提供了两个例子,一个是使用QGraphic是View图形框架的,一个是Qt自己写的一个简单的图形编辑器。

这两个都可以参考。这里简单的描述一下我自己抄来的。

class MoveCommand : public QUndoCommand
{
public:
    MoveCommand(QGraphicsScene *graphicsScene, const QPointF & delta ,
                QUndoCommand * parent = 0);
    void undo() Q_DECL_OVERRIDE;
    void redo() Q_DECL_OVERRIDE;
private:
    QList<QGraphicsItem *> items;
    QGraphicsScene *myGraphicsScene;
    QPointF myDelta;
    bool bMoved;
};

MoveCommand::MoveCommand(QGraphicsScene *graphicsScene, const QPointF &delta, QUndoCommand *parent)
    : QUndoCommand(parent)
{
    items = graphicsScene->selectedItems();
    myDelta = delta;
    myGraphicsScene = graphicsScene;
    bMoved = true;
}

//! [2]
void MoveCommand::undo()
{
    foreach (QGraphicsItem *item, items) {
       item->moveBy(-myDelta.x(),-myDelta.y());
    }
    myGraphicsScene->update();
    setText(QObject::tr("Move %1,%2")
        .arg(-myDelta.x()).arg(-myDelta.y()));
    bMoved = false;
}
//! [2]

//! [3]
void MoveCommand::redo()
{
    if ( !bMoved ){
        foreach (QGraphicsItem *item, items) {
           item->moveBy(myDelta.x(),myDelta.y());
        }
        myGraphicsScene->update();
    }
    setText(QObject::tr("Move %1,%2")
        .arg(myDelta.x()).arg(myDelta.y()));
}

多个对象移动的动作是交给scene处理的,所以这里认为这个动作之前对象已经移动过了,在这个类里加了一个bMoved的标记, QUndoStack::push方法默认会调用redo方法,

所以第一次redo是不需要做的,除非做过undo后,再执行redo才能移动对象。

      我们可以创建一个QUndoView来观察 undoStack里的动作列表,不过发现如果在里面跳着执行,undostack会乱套,所以看看就好。



QGraphicsView 全详解 视口类型的视口可以是任何类型的QWidget,包括QGLWidget,这使得可以在视口中使用OpenGL进行渲染。视口事件:可以通过重写的函数来处理视口级别的事件,例如触摸事件和多点触控事件。类提供了许多常用的函数、信号和槽,用于管理和操作图形视图。 阅读详情

相关推荐

QT之QGraphicsView详细介绍

是 Qt GUI 库中的一个核心类,它是 Qt 图形视图框架的一部分,主要用于可视化地显示中的内容。QGraphicsView 提供了一个灵活且可定制的二维图形界面,支持丰富的交互功能,如平移、缩放、旋转,并能够管理和布局复杂的图形场景。基本特性:视图与场景分离类本身负责渲染和显示图形场景 (),而场景则负责存储和管理所有的图形项 (),这些图形项可以是文本、形状、图片等任何可视化元素。视口与坐标系统QGraphicsView 内部有一个视口,视口映射的是场景的部分或全部内容。

2401_83283786的博客 1万+

Qt图形视图框架:QGraphicsView 详解

Qt图形视图框架:QGraphicsView详解

友善啊,朋友的博客 7万+

手把手教你用Qt实现高级框选功能:支持组合键与自定义样式的QGraphicsView应用

本文深入探讨了如何基于Qt的QGraphicsView框架,从零构建一个支持组合键与自定义样式的工业级框选系统。文章详细分析了内置选择机制的局限性,并提供了完整的自定义实现方案,涵盖事件处理、坐标转换、性能优化以及CAD风格的高级交互功能,旨在帮助开发者打造流畅、精准的专业图形编辑体验。

weixin_29294975的博客 286

Qt Graphics View

Graphics View框架,场景视图,代码示例

zw_ggr_2017的博客 6108

Qt绘图实战:用QGraphicsScene打造可交互的2D地图编辑器(附完整代码)

本文通过实战项目,详细介绍了如何利用Qt的QGraphicsScene框架构建功能完备的2D地图编辑器。文章深入解析了场景、视图与图元的三层架构,并提供了实现拖拽、框选、序列化、图层管理等核心交互功能的完整代码与设计思路,为开发游戏关卡或流程图设计器等图形工具提供了清晰路径。

weixin_29218963的博客 431

基于QT(C++)实现绘图程序:从架构设计到性能优化的完整实践

图形用户界面(GUI)开发是现代桌面应用的核心技术,其底层原理涉及事件处理、图形渲染与软件架构设计。通过理解信号与槽机制、绘图设备(QPainter)以及模型-视图-控制器(MVC)模式,开发者能够构建高效、可维护的交互式应用。这些技术不仅提升了程序的响应速度与用户体验,还广泛应用于图形编辑、工业设计及数据可视化等领域。本文以QT(C++)框架为例,深入探讨如何实现一个支持多种绘图工具(如铅笔、直线、矩形)的绘图程序,涵盖从图形对象抽象、撤销重做(命令模式)到性能优化(如局部重绘与智能指针内存管理)的关键实

weixin_30617797的博客 347

Qt图形编程实战:基于QGraphicsView的画图软件开发

图形用户界面(GUI)开发是桌面应用的核心技术,Qt框架因其跨平台特性和完善的图形系统成为首选方案。QGraphicsView作为Qt的图形视图框架,采用场景-视图架构实现图形项的高效管理,支持选择、移动、缩放等交互操作。在工业设计、CAD绘图等领域,该技术能有效处理复杂图形元素的渲染与交互。通过实现一个简易画图软件,开发者可以掌握图形项创建、事件处理、撤销重做等关键技术点。项目采用Qt Creator 4.8.0+Qt 5.12开发,包含完整的图形项管理和用户交互实现,是学习Qt图形编程的优质案例。

www.itmmd.com 862

C++图形编辑器课程设计:从架构到实现的全流程实战指南

面向对象编程是C++的核心思想,它通过封装、继承和多态三大特性,将数据和操作数据的方法组织成对象,从而构建出模块化、可复用、易维护的软件系统。其原理在于将现实世界中的实体抽象为类,通过对象间的交互模拟业务逻辑。这一技术价值在于显著提升了大型工程代码的组织性和可扩展性。在图形用户界面(GUI)开发、游戏引擎、图形处理等应用场景中,面向对象设计尤为关键。本文以C++图形编辑器项目为例,深入探讨如何运用面向对象思想与设计模式(如命令模式实现撤销/重做功能),结合Qt框架进行跨平台开发,并解析双缓冲技术、事件处理、

weixin_30458043的博客 312

C++ Qt实战:从零开发跨平台画图软件,掌握GUI与图形学核心

图形用户界面(GUI)开发是桌面应用的核心技术,其原理在于通过事件驱动模型处理用户输入,并将数据模型的变化实时渲染到视图。C++凭借其零成本抽象和直接内存操作能力,在需要高性能图形渲染和密集计算的场景中具有显著优势,尤其适合开发对实时交互和图形处理有高要求的专业工具。结合成熟的跨平台框架如Qt,开发者不仅能构建具有原生体验的高性能应用,还能深入理解从事件处理、图形管线到数据序列化的完整技术栈。本文以开发一个功能完整的画图软件为例,详细解析如何利用C++和Qt实现绘图工具链、图形数据模型、撤销重做栈等核心模块

weixin_30110543的博客 324

手把手教你用Python+PyQt打造自己的Node Editor(附完整代码)

本文详细介绍了如何使用Python和PyQt5框架从零开始构建一个功能完备的可视化节点编辑器。文章深入解析了节点、端口和连接线等核心概念,并提供了完整的代码示例,涵盖图形界面搭建、交互逻辑实现、可扩展节点系统设计以及序列化、撤销重做等高级工程化实践,帮助开发者掌握创建专业级可视化编程工具的核心技能。

weixin_29294597的博客 121

C++ Qt设计模式实战:提升桌面应用架构与代码质量

设计模式是解决软件设计中常见问题的经典方案,其核心在于通过封装变化、解耦依赖来提升代码的可维护性和扩展性。在C++ Qt桌面应用开发中,随着项目规模增长,代码结构容易变得臃肿和耦合。通过将设计模式与Qt框架深度结合,开发者可以系统性地优化架构。例如,工厂方法模式能优雅管理复杂对象的创建,观察者模式与Qt信号槽机制天然契合,可用于构建灵活的事件驱动系统。这些模式的价值在于将开发思维从“实现功能”转向“设计架构”,从而应对频繁的需求变更。本文以C++ Qt开发为背景,深入解析了工厂方法、装饰器、命令等模式在图形

weixin_33957648的博客 389

Qt实战:用QGraphicsScene绘制可交互点位图(附十字定位源码)

本文详细介绍了如何使用Qt的QGraphicsScene框架构建高交互性的点位图系统,包括基础绘制、十字定位器实现和性能优化技巧。通过实战案例和源码示例,帮助开发者掌握工业级点位图开发的核心技术,提升Qt图形界面开发能力。

onion的博客 1060

KNX智能家居工程设计应用

KNX,是一个起源于欧洲的总线标准,主要应用于家居和楼宇中,对末端电气设备进行总线式的控制,比如照明、空调、地暖、电动窗帘和遮阳设备等等。根据2017年英国著名咨询公司BSRIA的数据报告显示,在中国的智能家居和灯光控制市场,KNX产品的市场份额为各类产品中排名第一,占据了42%的市场份额,远远领先于其他的标准协议。设备中一个继电器表示一路输出,某些功能可能需要用到多个输出,比如1个窗帘AC输出需要占用两路继电器输出,一个继电器用于控制正转,一个用于控制反转,而普通开关输出则需要占用一路继电器输出即可。

hhhh5555666的博客 934

Qt绘图工具Minidraw开发全解析:从架构设计到实战实现

图形用户界面(GUI)编程是桌面应用开发的核心技术,其原理在于将用户操作转化为事件信号,通过控件与逻辑分离的架构实现交互响应。在C++生态中,Qt框架凭借其信号与槽机制和丰富的图形组件,成为跨平台GUI开发的事实标准,尤其适合需要高性能图形渲染的应用场景。结合Visual Studio这一强大的集成开发环境,开发者能够高效构建功能完整的桌面软件。本文以Minidraw绘图工具为例,深入探讨如何运用Qt的QPainter绘图引擎和QGraphicsView架构,实现从基本图形绘制到复杂交互逻辑的完整流程。通过

weixin_34197488的博客 313

【ISP图像处理】Demosaic去马赛克技术演进与边缘优化策略

本文深入解析了ISP图像处理中的Demosaic(去马赛克)技术。从Bayer阵列原理出发,梳理了从双线性插值、Hamilton-Adams边缘导向算法到利用通道相关性与自相似性的技术演进历程,并重点探讨了针对边缘与纹理伪影的优化策略,为工程实践中的算法选型与硬件协同设计提供了专业指导。

weixin_29091445的博客 389

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

Qt案例 在对QGraphicsView视图修改和撤销修改图元操作时,使用命令模式实现。

当项目中有视图直接修改图元的功能时,常会有和这种执行与撤销图元修改的功能,以便于在修改图元后能够进行一个还原/执行操作,此时就适合使用命令模式设计来实现这个功能。

... 2408

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5512

第8部份:实现撤销命令

原文网址:http://www.dazzle.plus.com/linux/QtCreator/part08.htm 第8部份:实现撤销命令 撤销命令 Qt的撤销框架使用命令模式实现了应用程序的撤销/重做功能。命令模式是这样的思相在应用程序中所有的编辑操作会创建命令对象的实例。每个命令对象也知道怎么撤销它的变化。这里,我们将为添加,移动和删除电台操作实现撤销/重做功能,分别定义继承类QUnd

挪威的森林 1283

智能枕头

睡觉和吃饭是一样重要的,一个人想要健康的体魄,不仅要饮食得当,更需要有一个好的睡眠质量。随着人们生活品质的提高,人们对于睡眠的要求越来越高,那么就非常需要一款舒适的枕头。为了适应市场的需求,我爱物联网推出了智能枕头。因为智能枕头可以给头部及颈椎一个良好的承托力,舒适、柔软、放松,让人更好的进入睡眠。 目录 一、智能枕头方案介绍 二、智能枕头的优点 三、智能枕头功能介绍 四、智能枕头APP开发 五、...

6108我爱物联网方案开发优快云博客 3660

DeepSeek Harness桌面版安装教程:从零配置到实用插件推荐

在AI编程工具逐步普及的今天,开发者越来越关注如何将大模型能力无缝融入日常编码流程。这类工具的核心在于构建一个连接模型服务与本地开发环境的中间层,通过项目级上下文理解、终端指令执行和插件机制,让AI真正成为能动手干活的编程副驾驶。安装配置过程中,环境准备、模型服务连接与工具权限设置是三个关键环节。完成基础搭建后,选择合适的插件能显著提升代码质量与问题排查效率,例如基于代码审查的规范对齐和安全扫描,以及面向运行时日志关联分析与性能告警的诊断工具。本文以DeepSeek Harness桌面版为例,从环境自查、安

weixin_31286719的博客 315

基于OpenCV与Qt的C++图像处理软件开发:从架构设计到工程实践

计算机视觉与图形界面开发是C++工程实践中的核心领域。OpenCV作为计算机视觉的事实标准库,提供了从基础图像处理到高级机器视觉算法的丰富功能;而Qt框架则是构建跨平台桌面应用的首选工具,其信号槽机制与丰富的UI组件极大地提升了开发效率。将两者结合,不仅能实现强大的图像处理能力,还能构建出交互友好的专业软件,其技术价值在于打通了底层算法与上层应用的完整链路。在实际应用中,这种技术组合广泛用于工业视觉检测、医疗影像分析、自动驾驶感知系统等场景。本文聚焦于**cv::Mat与QImage的高效转换**、**MV

weixin_29191761的博客 238

第03章 Hermes Agent 核心原理

环境跑通之后,读者会很自然地想问:Hermes 的内部到底是怎么转起来的?为什么它能做到"越用越聪明"?长对话不会忘记上下文吗?这一章用尽量短的篇幅把核心原理讲清楚。理解原理不是为了纸上谈兵,而是为了在第7章实战时能判断"为什么 Hermes 这么响应"以及"我应该把哪类任务交给它"。

亢少军的博客 142

为什么LibreCAD是专业2D绘图设计的终极自由选择:5大技术优势深度解析

LibreCAD作为一款完全免费的开源2D CAD软件,为工程师、设计师和学生提供了强大的二维绘图解决方案。这款基于Qt框架开发的跨平台CAD工具能够无缝读取和编辑DXF、DWG等主流CAD文件格式,是商业CAD软件的完美免费替代方案。无论是机械设计、建筑制图还是电气原理图绘制,LibreCAD都能满足专业绘图需求。 ## 🎯 技术架构深度剖析:开源CAD的工程实现 ### 模块化架构设计

gitblog_00422的博客 248

PPT制作能力在职场中真的重要吗?一定要美术功底才能学好PPT吗?

我推出PPT技能培训专栏啦!好的PPT可以让你事半功倍、2023拥有PPT能力还可以让你具备一门极有价值的斜杠能力。更多内容请进:梦幻训练营专栏。专栏内会用本人积累的近10年的PPT学习方法论在短时间内教会你如何制作出精美绝伦的PPT,每篇教程后还会免费赠送一些小福利,不可多得。

打造全国最全的AI Agent开发知识领域的博客 728

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: QGraphicsView 框架学习(三),图形对象的剪贴板操作。
下一篇: QGraphicsView 框架学习(五) 边框与控制点。
firebolt2002
博客等级 码龄24年 74粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值