【qt】CAD下

目录

  • 一.前言
  • 二.缩放
    • 1.逻辑
    • 2.获取图形项选中的个数
    • 3.获取图形项并放大
    • 4.视图缩放
    • 5.完整代码
    • 6.效果展示
    • 7.缩小完整代码
  • 三.旋转
    • 1.图形项进行旋转
    • 2.视图的旋转
    • 3.完整代码
    • 4.效果展示
    • 5.右转代码
  • 四.恢复
    • 1.图形项复原
    • 2.视图复原
    • 3.完整代码
    • 4.效果展示
  • 五.前后置
    • 1.设置z轴的值
    • 2.后置代码
  • 六.组合和拆分
    • 1.逻辑
    • 2.创建图形项组
    • 3.图形项添加到组
    • 4.设置组的标识
    • 5.完整代码
    • 6.效果演示
    • 7.拆分代码
    • 8.效果展示
  • 七.删除
    • 1.删除代码
  • 八.双击编辑图形项颜色
    • 1.逻辑
    • 2.获取图形项的类型
    • 3.画刷模版函数
    • 4.图形项类型的判断
    • 5.画笔模版函数
    • 6.线条图形项
    • 7.文本图形项
    • 8.效果展示
  • 九.按键微移
    • 1.逻辑
    • 2.删除图形项
    • 3.旋转图形项
    • 4.放大,放小
    • 5.上下左右
    • 6.完整代码
  • 十.鼠标移动
    • 1.逻辑
    • 2.状态栏添加标签
    • 3.设置视图,场景坐标
    • 4.效果展示
  • 十一.鼠标单击
    • 1.逻辑
    • 2.通过场景坐标获取图形项
    • 3.场景坐标转换成图形项坐标
    • 4.设置图形项的信息
    • 5.完整代码
    • 6.效果展示![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1acd1a3fe0fb42248b72bd9c4d9e48dd.png)
  • 十二.总结

一.前言

我的发,好久没有更新了,忙着考试去了,只剩下最后一科英语了,我赶紧来更新,哈哈,上节课我们的CAD项目还没有做完呢,OK,那就来咯!
我们上节课的成果:
在这里插入图片描述
上节课我们只实现了左边工具栏的功能,但是我们上面的工具栏的功能还没有进行实现,所以我们现在话不多说,直接开干!

二.缩放

1.逻辑

我们可以选择一个或者多个图形项
为了演示功能,我们如果选择的一个就对图形项进行缩放
如果选择的多个就对视图进行缩放

2.获取图形项选中的个数

void MainWindow::on_actionBig_triggered()
{int count=scene->selectedItems().count();
}

看不懂?不存在的,看我的
在这里插入图片描述
**selectedItems()返回的一个装图形项指针的列表,所以我们可以用count()**来统计个数,哈哈.

3.获取图形项并放大

if(count==1){auto item=scene->selectedItems().at(0);item->setScale(item->scale()+0.1);}

如果选中的个数为1,那么是对图形项进行操作!
刚刚说了**selectedItems()返回的是一个列表,所以可以用at()**来获取到图形项.
**setScale()**见名知意,这个就是用来缩放图形项的,此处是在原有的基础上进行缩放.
在这里插入图片描述

4.视图缩放

其他的情况我们就用视图的缩放

else{ui->graphicsView->scale(1.1,1.1);}

可以直接设置,不用像图形项一样获取原来的,因为看下图的翻译
在这里插入图片描述

5.完整代码

void MainWindow::on_actionBig_triggered()
{int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setScale(item->scale()+0.1);}else{ui->graphicsView->scale(1.1,1.1);}
}

6.效果展示

在这里插入图片描述
这个是放大了的,可惜暂时还不会给你录动态图进行展示,哈哈.

7.缩小完整代码

解:由上同理可得,哈哈,想起了我的初中数学.

void MainWindow::on_actionSmall_triggered()
{int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setScale(item->scale()-0.1);}else{ui->graphicsView->scale(0.9,0.9);}
}

运行结果就你们自己去试了!

三.旋转

1.图形项进行旋转

讲过的地方我就不讲了.

int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setRotation(item->rotation()-30);}

还是在原有的基础上进行旋转.
在这里插入图片描述

2.视图的旋转

 else{ui->graphicsView->rotate(-30);}

负号是逆时针进行旋转哦.
在这里插入图片描述

3.完整代码

void MainWindow::on_actionLeft_triggered()
{int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setRotation(item->rotation()-30);}else{ui->graphicsView->rotate(-30);}
}

4.效果展示

在这里插入图片描述

5.右转代码

void MainWindow::on_actionRight_triggered()
{int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setRotation(item->rotation()+30);}else{ui->graphicsView->rotate(+30);}
}

四.恢复

1.图形项复原

int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setRotation(0);item->setScale(1.0);}

只需要将缩放倍数设置为1,旋转设置为0即可

2.视图复原

else{ui->graphicsView->resetTransform();}

在这里插入图片描述

3.完整代码

void MainWindow::on_actionHuifu_triggered()
{int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setRotation(0);item->setScale(1.0);}else{ui->graphicsView->resetTransform();}
}

4.效果展示

在这里插入图片描述
自己去玩完.

五.前后置

1.设置z轴的值

void MainWindow::on_actionTop_triggered()
{int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setZValue(item->zValue()+1);}
}

在原来的基础上对,z的值进行加1层!
在这里插入图片描述

2.后置代码

void MainWindow::on_actionButton_triggered()
{int count=scene->selectedItems().count();if(count==1){auto item=scene->selectedItems().at(0);item->setZValue(item->zValue()-1);}
}

自己去运行效果,我这里运行了,截图你们也看不出来!

六.组合和拆分

1.逻辑

我们将选中的多个图形项,放在一个图形项组中,相当于一个新的图像项.

2.创建图形项组

QGraphicsItemGroup* group=new QGraphicsItemGroup;
scene->addItem(group);

因为组可以视为当个项,所有我们可以添加到场景.
在这里插入图片描述

3.图形项添加到组

 for(int i=0;i<count;i++){auto item=scene->selectedItems().at(0);item->setSelected(false);item->clearFocus();group->addToGroup(item);}

当我们添加到组以后,原来的图像项的选中和聚焦状态都取消.
在这里插入图片描述

4.设置组的标识

group->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);group->setZValue(ZVaule++);scene->clearSelection();group->setSelected(true);

设置成可选中,可移动,可聚焦,同时设置z轴的值.
并将其设置为新的选中.

5.完整代码

void MainWindow::on_actionZuhe_triggered()
{int count=scene->selectedItems().count();if(count>1){QGraphicsItemGroup* group=new QGraphicsItemGroup;scene->addItem(group);for(int i=0;i<count;i++){auto item=scene->selectedItems().at(0);item->setSelected(false);item->clearFocus();group->addToGroup(item);}group->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);group->setZValue(ZVaule++);scene->clearSelection();group->setSelected(true);}}

6.效果演示

在这里插入图片描述
嘿嘿嘿,自己就可以组合成任何的图像,哈哈哈.

7.拆分代码

获取的图形项,强转类型转换为图形项组然后进行拆分.

void MainWindow::on_actionChaifen_triggered()
{int count=scene->selectedItems().count();if(count==1){auto group=(QGraphicsItemGroup*)scene->selectedItems().at(0);scene->destroyItemGroup(group);}
}

在这里插入图片描述

8.效果展示

在这里插入图片描述

七.删除

1.删除代码

void MainWindow::on_actionDel_triggered()
{int count=scene->selectedItems().count();if(count>0){for(int i=0;i<count;i++){auto item=scene->selectedItems().at(0);scene->removeItem(item);}}
}

在这里插入图片描述

八.双击编辑图形项颜色

1.逻辑

因为每个图形项的设置颜色方式,不一定相同
有的设置画刷,有的设置画笔,所以我们要对图形项的类型进行判断
因为有很多不同的图形项,所以我们可以用一个模板函数来传参来进行处理.

2.获取图形项的类型

void MainWindow::on_graphicsView_mouseDoubleClick(QPoint point)
{int count =scene->selectedItems().count();if(count==0){return;}auto item=scene->selectedItems().at(0);switch (item->type()) {}

type()返回的一个整数,可以用switch来进行判断!
在这里插入图片描述

3.画刷模版函数

template <class T>
void setBrushColor(T *item)
{QColor color=item->brush().color();color=QColorDialog::getColor(color,NULL,"选择填充颜色");if(color.isValid()){item->setBrush(QBrush(color));}
}

4.图形项类型的判断

switch (item->type()) {case QGraphicsRectItem::Type:{auto item2=qgraphicsitem_cast<QGraphicsRectItem*>(item);setBrushColor(item2);break;}case QGraphicsEllipseItem::Type:{auto item2=qgraphicsitem_cast<QGraphicsEllipseItem*>(item);setBrushColor(item2);break;}case QGraphicsPolygonItem::Type:{auto item2=qgraphicsitem_cast<QGraphicsPolygonItem*>(item);setBrushColor(item2);break;}}

这个几个都是一种类型的,调用模版函数设置画刷的颜色就可以!

5.画笔模版函数

template <class T>
void setPenColor(T*item)
{QPen pen;QColor color=item->pen().color();color=QColorDialog::getColor(color,NULL,"选择填充颜色");if(color.isValid()){pen.setColor(color);item->setPen(pen);}
}

6.线条图形项

因为不是用画刷进行填充颜色的,所以我们用画笔.

case QGraphicsLineItem::Type:{auto item2=qgraphicsitem_cast<QGraphicsLineItem*>(item);setPenColor(item2);break;}

7.文本图形项

case QGraphicsTextItem::Type:{auto item2=qgraphicsitem_cast<QGraphicsTextItem*>(item);QFont font;font=item2->font();bool ok=false;font=QFontDialog::getFont(&ok,font,this,"选择字体");if(ok){item2->setFont(font);}break;}

用了一个字体对话框.

8.效果展示

在这里插入图片描述
在这里插入图片描述
非常的银杏.

九.按键微移

1.逻辑

我们上节课不写写了一个键盘事件嘛
现在我们可以根据键盘来对图形项进行操作

2.删除图形项

if(scene->selectedItems().count()!=1){return;}auto item=scene->selectedItems().at(0);if(event->key()==Qt::Key_Delete){scene->removeItem(item);}

就是键盘上的Delete键

3.旋转图形项

else if(event->key()==Qt::Key_Space){item->setRotation(item->rotation()+10);}

Key_Space就是空格键.

4.放大,放小

else if(event->key()==Qt::Key_PageUp){item->setScale(item->scale()+0.1);}else if(event->key()==Qt::Key_PageDown){item->setScale(item->scale()-0.1);}

5.上下左右

else if(event->key()==Qt::Key_Left){item->setX(item->x()-1);}else if(event->key()==Qt::Key_Right){item->setX(item->x()+1);}else if(event->key()==Qt::Key_Up){item->setY(item->y()-1);}else if(event->key()==Qt::Key_Down){item->setY(item->y()+1);}

6.完整代码

void MainWindow::on_graphicsView_keyPress(QKeyEvent *event)
{if(scene->selectedItems().count()!=1){return;}auto item=scene->selectedItems().at(0);if(event->key()==Qt::Key_Delete){scene->removeItem(item);}else if(event->key()==Qt::Key_Space){item->setRotation(item->rotation()+10);}else if(event->key()==Qt::Key_PageUp){item->setScale(item->scale()+0.1);}else if(event->key()==Qt::Key_PageDown){item->setScale(item->scale()-0.1);}else if(event->key()==Qt::Key_Left){item->setX(item->x()-1);}else if(event->key()==Qt::Key_Right){item->setX(item->x()+1);}else if(event->key()==Qt::Key_Up){item->setY(item->y()-1);}else if(event->key()==Qt::Key_Down){item->setY(item->y()+1);}
}

效果自己去用键盘玩哦!

十.鼠标移动

1.逻辑

当我们的鼠标进行移动的时候,我们就显示视图坐标和场景的坐标.
可通过视图坐标转到场景坐标.
同时,我们希望在状态栏中进行显示,所以我们需要在状态栏中,添加标签.

2.状态栏添加标签

我们原来讲过,状态栏添加组件,只能通过代码.
头文件中进行创建:
在这里插入图片描述
构造函数中,进行实现:

    labView=new QLabel("视图坐标:");labScene=new QLabel("场景坐标:");labItem=new QLabel("图形项坐标:");labInfo=new QLabel("图形项信息:");labView->setMinimumWidth(150);labScene->setMinimumWidth(150);labItem->setMinimumWidth(150);labInfo->setMinimumWidth(150);this->statusBar()->addWidget(labView);this->statusBar()->addWidget(labScene);this->statusBar()->addWidget(labItem);this->statusBar()->addWidget(labInfo);

运行结果:
在这里插入图片描述

3.设置视图,场景坐标

void MainWindow::on_graphicsView_mouseMove(QPoint point)
{labView->setText(QString::asprintf("视图坐标:%d,%d",point.x(),point.y()));QPointF pointScene=ui->graphicsView->mapToScene(point);labScene->setText(QString::asprintf("场景坐标:%.0f,%.0f",pointScene.x(),pointScene.y()));
}

返回的浮点坐标.
在这里插入图片描述

4.效果展示

在这里插入图片描述
会随着我的鼠标移动而变化!

十一.鼠标单击

1.逻辑

当我们单击一个图形项的时候,就显示图形项坐标和图形项的信息.

2.通过场景坐标获取图形项

QPointF pointScene=ui->graphicsView->mapToScene(point);
auto item=scene->itemAt(pointScene,ui->graphicsView->transform());

通过场景坐标得到场景中的项
在这里插入图片描述

3.场景坐标转换成图形项坐标

QPointF pointItem=item->mapFromScene(pointScene);//场景坐标转图形项坐标
labItem->setText(QString::asprintf("图形项坐标:%.0f,%.0f",pointItem.x(),pointItem.y()));

在这里插入图片描述

4.设置图形项的信息

还记得我们原理自己定义的数据嘛,就是setDate()
现在我们就可以拿出来用了.

labInfo->setText(item->data(ITEMINFO).toString()+"ITEMID:"+item->data(ITEMID).toString());

在这里插入图片描述
在这里插入图片描述
这就是当年我们自定义数据的地方
在这里插入图片描述
现在就可以根据键来获取到,当时我们设置的图像名称和ID.

5.完整代码

void MainWindow::on_graphicsView_mousePress(QPoint point)
{QPointF pointScene=ui->graphicsView->mapToScene(point);auto item=scene->itemAt(pointScene,ui->graphicsView->transform());if(item){QPointF pointItem=item->mapFromScene(pointScene);//场景坐标转图形项坐标labItem->setText(QString::asprintf("图形项坐标:%.0f,%.0f",pointItem.x(),pointItem.y()));labInfo->setText(item->data(ITEMINFO).toString()+" ID:"+item->data(ITEMID).toString());}
}

6.效果展示在这里插入图片描述

OK,到这里,咱们这个项目就完结撒花啦,期待与你一起进步!

十二.总结

这就是基于QGraphicsView架构做的CAD项目,当然啦,还可以有更多的创意,你也试试看吧!

播下一颗种子…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 扩容 根分区

CentOS7&#xff0c;LVM根分区扩容步骤&#xff1a; LVM扩容思维流程&#xff1a;创建一个物理分区–>将这个物理分区转换为物理卷–>把这个物理卷添加到要扩展的卷组中–>然后才能用extend命令扩展此卷组中的逻辑卷 1.查看现有分区大小 df -TH 2.关机增加大小为40G(…

appinventor2中求某个值在列表中的索引用什么方法?

使用“求对象在列表中的位置”方法就可以了&#xff1a; 返回指定对象在列表中的位置&#xff0c;从 1 开始&#xff0c;如果不在列表中&#xff0c;则返回 0。 相应地&#xff0c;知道了索引&#xff0c;从列表中取值得方法是&#xff1a;选择列表中索引值对应的列表项 返回…

linux下安装kkFileView4

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 安装kkFileView前需要安装LibreOffic…

昇思MindSpore学习总结二——张量

1、张量 张量tensor表示的是一个多维的矩阵&#xff0c;比如零维就是一个点&#xff0c;一维就是向量&#xff0c;二维就是一般的矩阵&#xff0c;多维就相当于一个多维的数组&#xff0c;这和numpy是对应的&#xff0c;而且PyTorch的Tensor和numpy的ndarray可以相互转换&#…

Python | Leetcode Python题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution:def dfs(self, grid, r, c):grid[r][c] 0nr, nc len(grid), len(grid[0])for x, y in [(r - 1, c), (r 1, c), (r, c - 1), (r, c 1)]:if 0 < x < nr and 0 < y < nc and grid[x][y] "1":self.d…

【论文速读】|MEDFUZZ:探索大语言模型在医学问题回答中的鲁棒性

本次分享论文&#xff1a;MEDFUZZ: EXPLORING THE ROBUSTNESS OF LARGE LANGUAGE MODELS IN MEDICAL QUESTION ANSWERING 基本信息 原文作者&#xff1a;Robert Osazuwa Ness, Katie Matton, Hayden Helm, Sheng Zhang, Junaid Bajwa, Carey E. Priebe, Eric Horvitz 作者单…

Lua博客网站支持搜索、评论、登录注册

该简易博客示例用于学习网站的基础知识与MySQL数据库。 简述&#xff1a;开源Lua网站开发服务(FastWeb)支持&#xff1a;注册、登录、文章分页、评论分页、简易权限管理和搜索功能。发帖功能支持Markdown(支持记忆功能)图示&#xff1a;

Java之线程相关应用实现

后台线程 一个进程中只有后台进程运行&#xff0c;该进程将会结束。 新创建的线程默认为前台线程&#xff0c;Java中只要有一个前台线程运行&#xff0c;就不会结束程序&#xff0c;如果只有后台线程运行&#xff0c;程序就会结束&#xff0c;可以在线程对象启动前执行setDae…

【js + ckeditor】插入base64格式的图片

一、需求说明 直接把图片转成base64插入到富文本 二、需求分析 1、富文本图片格式处理位置 在ckeidtor的目录下有个plugins文件夹&#xff0c;在plugins下新建一个文件夹&#xff08;自己命名&#xff0c;如simpleupload&#xff09;&#xff0c;进入simpleupload文件夹&…

微服务和kafka

一、微服务简介 1.单体架构 分布式--微服务--云原生 传统架构&#xff08;单机系统&#xff09;&#xff0c;一个项目一个工程&#xff1a;比如商品、订单、支付、库存、登录、注册等等&#xff0c;统一部署&#xff0c;一个进程 all in one的架构方式&#xff0c;把所有的…

深入探讨C++的高级反射机制(2):写个能用的反射库

在现代软件开发中&#xff0c;反射是一种强大的特性&#xff0c;它可以支持程序在运行时查询和调用对象的属性和方法。 但是在C中&#xff0c;没有内置的反射机制。我们可以通过一些巧妙的技术模拟反射的部分功能。 上一篇文章写了个简单的反射功能&#xff0c;这回完善一下&a…

3.PyQt6常用基本控件

目录 常用控件 1.文本类控件 1.QLable标签控件 1.设置标签文本 2.设置标签文本和对齐方式 3.换行显示 4.添加超链接 5.为标签设置图片 6.获取标签文本 2.QLineEdit单行文本控件 3.QTextEdit多行富文本控件 4.QPlainTextEdit纯文本控件 5.QSpinBox整数数字选择控件 …

开发板以电脑为跳板连接互联网

标题 开发板以电脑为跳板连接互联网网络共享方式桥接方式 开发板以电脑为跳板连接互联网 分享下用网线直连电脑的开发板如何以电脑为跳板连接互联网的两个方法。 网络共享方式桥接方式 补充下&#xff0c;我的电脑连接的是无线网络&#xff0c;开发板和电脑是用网线进行连接的…

Python 高级编程:文件操作与错误处理

在前几篇文章中&#xff0c;我们介绍了Python的基本语法、函数和模块以及面向对象编程。这些知识对于大部分日常编程问题已经足够&#xff0c;但对于需要分析大数据的人来说&#xff0c;这些还不够。本章将介绍Python的文件操作以及错误处理与调试。 目录 文件操作读文件写文…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

【嵌入式Linux】i.MX6ULL GPIO 中断服务函数注册与编写

文章目录 1 外部中断初始化与中断服务函数1.2 外部中断初始化函数 exti_init1.2.1 GPIO引脚配置1.2.2 中断使能与注册1.2.3 GIC_EnableIRQ()函数的分析 1.3 中断服务函数 gpio1_io20_irqhandler1.3.1 消抖处理1.3.2 中断事件处理1.3.3 清除中断标志 2 BUG处理2.1 问题描述2.2 解…

网易Filmly网盘影片播放器安卓TV版

我们在观看网盘内的影视时&#xff0c;想要高清/原画质观看视频&#xff0c;甚至倍速功能往往都需要开通网盘会员才可以&#xff0c;否则你只能使用”马赛克”画质观看。 最近网易上线了一款播放器&#xff1a;Filmly &#xff0c;它支持直连网盘影视资源&#xff0c;可以高速…

深入理解计算机系统 CSAPP 家庭作业7.12

A:refptr (unsigned)(ADDR(r.symbol) r.addend - refaddr) 0x4004f8 (-4) - 0x4004ea 0xa B:refaddr 0x4004d0 0xa 0x4004da refptr 0x400500 (-4) - 0x4004da 0x22 ​​​​​​​

Python24 机器学习之决策树

1.什么是机器学习&#xff1f; 机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;它使计算机系统能够从经验中学习并根据这些学习的数据做出决策或预测&#xff0c;而无需进行明确的编程。简而言之&#xff0c;机器学习涉及算法和统计模型的使用&#xff0…

Hugo Barra对Apple Vision Pro 硬件和软件的详细评述

原文&#xff1a;hugo.blog/2024/03/11/vision-pro 这篇文章的作者是Hugo Barra。Hugo Barra曾是Meta公司&#xff08;前身为Facebook&#xff09;旗下Oculus VR/AR团队的负责人。他在2017年至2020年期间领导了Oculus的团队&#xff0c;参与了多个VR头显的开发和发布。Hugo Bar…