【qt】平面CAD(计算机辅助设计 )项目 上
CAD
- 一.前言
- 二.界面设计
- 三.提升类
- 四.接受槽函数
- 五.实现图形action
- 1.矩形
- 2.椭圆
- 3.圆形
- 4.三角形
- 5.梯形
- 6.直线
- 7.文本
- 六.总结
一.前言
用我们上节课刚刚学过的GraphicsView架构来绘制一个可以交互的CAD项目!
效果图:
二.界面设计
添加2个工具栏

需要蔬菜的dd我!
添加action:

拖放界面:

设置一些基本的属性:

三.提升类
自定义一个类,继承QGraphicsView

找到鼠标和键盘事件.

添加信号和鼠标事件和键盘事件:

鼠标事件和键盘事件的重写,功能就是发出信号带出视图坐标:
mygraphicsview.cpp中
#include "mygraphicsview.h"
#include <QMouseEvent>MyGraphicsView::MyGraphicsView(QWidget *parent) : QGraphicsView(parent)
{}void MyGraphicsView::keyPressEvent(QKeyEvent *event)
{emit keyPress(event);QGraphicsView::keyPressEvent(event);
}void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){QPoint point=event->pos();emit mousePress(point);}QGraphicsView::mousePressEvent(event);
}void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){QPoint point=event->pos();emit mouseDoubleClick(point);}QGraphicsView::mouseDoubleClickEvent(event);
}void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{QPoint point=event->pos();emit mouseMove(point);QGraphicsView::mouseMoveEvent(event);
}
类提升

四.接受槽函数
用这个命名格式可以自动关联哦

想做个空实现,不然运行会报错,上面这些都是前面我们讲过的,就不细讲了,接下来进行这节课的重点.
创建场景:

五.实现图形action
1.矩形
void MainWindow::on_actionRect_triggered()
{QGraphicsRectItem*item=new QGraphicsRectItem(-100,-50,200,100);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::blue));item->setZValue(ZVaule++);//堆叠的等级,越高越在表面,z的高度item->setData(ITEMID,itemID++);//可以为图形项自定义数据item->setData(ITEMINFO,"矩形");item->setPos(qrand()%50,qrand()%50);//在坐标附近生成图形项scene->addItem(item);scene->clearSelection();//清空选择的item->setSelected(true);//添加的设置选中
}
在构造函数中加一个随机种子:

在头文件中加

运行结果:

2.椭圆
void MainWindow::on_actionEllisp_triggered()
{QGraphicsEllipseItem*item=new QGraphicsEllipseItem(-100,-50,200,100);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::green));item->setZValue(ZVaule++);//堆叠的等级,越高越在表面,z的高度item->setData(ITEMID,itemID++);//可以为图形项自定义数据item->setData(ITEMINFO,"椭圆");item->setPos(qrand()%50,qrand()%50);//在坐标附近生成图形项scene->addItem(item);scene->clearSelection();//清空选择的item->setSelected(true);//添加的设置选中
}
运行结果:

3.圆形
void MainWindow::on_actionCircle_triggered()
{QGraphicsEllipseItem*item=new QGraphicsEllipseItem(-100,-50,200,200);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::yellow));item->setZValue(ZVaule++);//堆叠的等级,越高越在表面,z的高度item->setData(ITEMID,itemID++);//可以为图形项自定义数据item->setData(ITEMINFO,"圆形");item->setPos(qrand()%50,qrand()%50);//在坐标附近生成图形项scene->addItem(item);scene->clearSelection();//清空选择的item->setSelected(true);//添加的设置选中
}
运行结果:

4.三角形
void MainWindow::on_actionSanjiao_triggered()
{QGraphicsPolygonItem*item=new QGraphicsPolygonItem;QPolygonF points;points.append(QPoint(0,-80));points.append(QPoint(-50,0));points.append(QPoint(50,0));item->setPolygon(points);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::darkRed));item->setZValue(ZVaule++);//堆叠的等级,越高越在表面,z的高度item->setData(ITEMID,itemID++);//可以为图形项自定义数据item->setData(ITEMINFO,"三角形");item->setPos(qrand()%50,qrand()%50);//在坐标附近生成图形项scene->addItem(item);scene->clearSelection();//清空选择的item->setSelected(true);//添加的设置选中
}
运行结果:

5.梯形
void MainWindow::on_actionTixing_triggered()
{QGraphicsPolygonItem*item=new QGraphicsPolygonItem;QPolygonF points;points.append(QPoint(-50,-50));points.append(QPoint(-100,100));points.append(QPoint(100,100));points.append(QPoint(50,-50));item->setPolygon(points);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);item->setBrush(QBrush(Qt::darkGreen));item->setZValue(ZVaule++);//堆叠的等级,越高越在表面,z的高度item->setData(ITEMID,itemID++);//可以为图形项自定义数据item->setData(ITEMINFO,"梯形");item->setPos(qrand()%50,qrand()%50);//在坐标附近生成图形项scene->addItem(item);scene->clearSelection();//清空选择的item->setSelected(true);//添加的设置选中
}
运行结果:

6.直线
void MainWindow::on_actionLine_triggered()
{QGraphicsLineItem*item=new QGraphicsLineItem(-100,-100,100,100);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);QPen pen;pen.setWidth(4);pen.setColor(Qt::red);item->setPen(pen);item->setZValue(ZVaule++);//堆叠的等级,越高越在表面,z的高度item->setData(ITEMID,itemID++);//可以为图形项自定义数据item->setData(ITEMINFO,"直线");item->setPos(qrand()%50,qrand()%50);//在坐标附近生成图形项scene->addItem(item);scene->clearSelection();//清空选择的item->setSelected(true);//添加的设置选中
}
运行结果:

7.文本
void MainWindow::on_actionText_triggered()
{QString str=QInputDialog::getText(this,"输入文本","请输入文本:");QGraphicsTextItem*item=new QGraphicsTextItem(str);item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsFocusable);QFont font;font.setBold(true);font.setPixelSize(30);item->setFont(font);item->setDefaultTextColor(Qt::red);//设置默认文本颜色item->setZValue(ZVaule++);//堆叠的等级,越高越在表面,z的高度item->setData(ITEMID,itemID++);//可以为图形项自定义数据item->setData(ITEMINFO,"文本");item->setPos(qrand()%50,qrand()%50);//在坐标附近生成图形项scene->addItem(item);scene->clearSelection();//清空选择的item->setSelected(true);//添加的设置选中
}
运行结果:

六.总结

因时间有限,我们先完成一半!
图形项的添加基本一致.
- 先创建一个图形项
- 设置标识,可以移动
- 设置画刷或者画笔
- 设置堆叠等级
- 设置数据
- 随机设置位置
- 创建添加图形项
- 清空原来的选择
- 设置现在添加的选择
一生摘叶,不知寻根!
相关文章:
【qt】平面CAD(计算机辅助设计 )项目 上
CAD 一.前言二.界面设计三.提升类四.接受槽函数五.实现图形action1.矩形2.椭圆3.圆形4.三角形5.梯形6.直线7.文本 六.总结 一.前言 用我们上节课刚刚学过的GraphicsView架构来绘制一个可以交互的CAD项目! 效果图: 二.界面设计 添加2个工具栏 需要蔬菜的dd我! 添加action: …...
C++中bool类型的使用细节
C中bool类型的使用细节 ANSIISO C标准添加了一种名叫bool的新类型(对 C来说是新的)。它的名称来源于英国数学家 George Boole,是他开发了逻辑律的数学表示法。在计算中,布尔变量的值可以是true或false。过去,C和C一样,也没有布尔…...
Java 面向对象 -- Java 语言的封装、继承、多态、内部类和 Object 类
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 007 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...
【C++】和【预训练模型】实现【机器学习】【图像分类】的终极指南
目录 💗1. 准备工作和环境配置💕 💖安装OpenCV💕 💖安装Dlib💕 下载并编译TensorFlow C API💕 💗2. 下载和配置预训练模型💕 💖2.1 下载预训练的ResNet…...
HTML5 Web SQL数据库:浏览器中的轻量级数据库解决方案
在HTML5时代,Web开发迎来了一系列创新特性,其中之一便是Web SQL数据库。尽管Web SQL标准已被W3C废弃,转而推荐IndexedDB作为替代,但了解Web SQL对于学习Web存储技术的演进历程仍有其价值。本文将详细介绍Web SQL数据库的基本概念、…...
C++ const关键字有多种用法举例
C const关键字有多种用法 可以用来修饰变量、指针、函数参数、成员函数等。可以看到const在C中有多种用法,主要用于保证数据的不可变性,增强代码的安全性和可读性。在实际编程中,根据需要选择适当的const用法,可以有效避免意外修…...
Makefile-快速掌握
引用 本文完全参照大佬的文档写的,写这篇文章只是为了梳理一下知识 https://github.com/marmotedu/geekbang-go/blob/master/makefile/Makefile%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md 介绍 Makefile是一个工程文件的编译规则,描述了整个工程的编译…...
定个小目标之刷LeetCode热题(20)
这题与上一题有一点不同,上一题是判断链表是否存在环,这题是寻找入环的第一个节点,有一个规则是这样的,在存在环的情况下,运用快慢指针判断是否有环结束时,把快指针指向头结点,慢指针不变&#…...
短剧分销小程序:影视产业链中的新兴力量
一、引言 在数字化浪潮的推动下,影视产业正迎来一场深刻的变革。短剧分销小程序作为这场变革中的新兴力量,正以其独特的魅力和价值,逐渐在影视产业链中崭露头角。本文将探讨短剧分销小程序在影视产业链中的新兴地位、其带来的变革以及未来的…...
使用fvm切换flutter版本
切换flutter版本 下载fvm 1、dart pub global activate fvm dart下载fvm 2、warning中获取下载本地的地址 3、添加用户变量path: 下载地址 终端查看fvm版本 fvm --version 4、指定fvm文件缓存地址 fvm config --cache-path C:\src\fvm(自定义地址&…...
python通过selenium实现自动登录及轻松过滑块验证、点选验证码(2024-06-14)
一、chromedriver配置环境搭建 请确保下载的驱动程序与你的Chrome浏览器版本匹配,以确保正常运行。 1、Chrome版本号 chrome的地址栏输入chrome://version,自然就得到125.0.6422.142 版本 125.0.6422.142(正式版本) (…...
【C++】开源项目收集
C 是一种强大的、静态类型的通用编程语言,它的开源生态系统非常丰富,拥有众多高质量的项目。以下是一些知名的C开源项目: Boost: 这是一个庞大的库集合,提供了大量的实用工具和组件,如文件系统、网络编程、智能指针等&…...
爬虫相关面试题
一,如何抓取一个网站? 1,去百度和谷歌搜一下这个网站有没有分享要爬取数据的API 2, 看看电脑网页有没有所需要的数据,写代码测试调查好不好拿,如果好拿直接开始爬取 3,看看有没有电脑能打开的手机网页&a…...
Spring Cloud Netflix 之 Ribbon
前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、负载均衡1.1、服务端负载均衡1.2、客户端负载均衡 2、Ribbon实现服务…...
C语言怎样记住那么多的颜⾊?
一、问题 ⾚、橙、⻩、绿、⻘、蓝、紫,如此之多的颜⾊,数字不好记,英⽂看程序还可以, 直接写也不好写。那么怎样记住那么多的颜⾊呢? 二、解答 颜⾊枚举值如下: enum COLORS {BLACK, /*O⿊*/BLUE, …...
LabVIEW软件开发任务的工作量估算方法
在开发LabVIEW软件时,如何准确估算软件开发任务的工作量。通过需求分析、功能分解、复杂度评估和资源配置等步骤,结合常见的估算方法,如专家判断法、类比估算法和参数估算法,确保项目按时按质完成,提供项目管理和资源分…...
【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error
如果大家使用这个vue 配合 element 框架不熟练,当你顺利按照文档安装好 vue 和 element 的时候想要使用element 的组件时候确无法展示出来,甚至报错。不妨看看是不是这个问题, 1.首先使用element 的时候,前提是把必须要的 elemen…...
Prometheus的四种指标类型
目录 一、Counter 计数器 1.1Counter 是计数器类型 1.2Counter 类型示例 二、Gauge 仪表盘 2.1Gauge是测量器类型 2.2Gauge 类型示例 三、Histogram 累积直方图 3.1Histogram 作用及特点 3.2使用 histogram 柱状图 四、Summary 摘要 一、Counter 计数器 1.1Counter …...
FastDFS SpringBoot 客户端 Demo搭建,支持文件上传下载
一、准备 fastdfs-client-java 依赖包 1、从 Git 下载 FastDFS java client SDK 源码 https://github.com/happyfish100/fastdfs-client-java.git<fastdfs-client-java 源码见附件> 2、使用ant从源码构建 ant clean package3、使用maven从源码安装 mvn clean instal…...
十大成长型思维:定位思维、商业思维、时间管理思维、学习成长思维、精力管理思维、逻辑表达思维、聚焦思维、金字塔原理、目标思维、反思思维
一、定位思维 定位思维是一种在商业和管理领域中至关重要的思维模式,它涉及到如何在顾客心智中确立品牌的独特位置,并使其与竞争对手区分开来。以下是关于定位思维的清晰介绍: 1、定义 定位思维是一种从潜在顾客的心理认知出发,通…...
在 SAP 系统中,利润中心(Profit Center)和业务范围(Business Area)都是用于内部管理报告的组织单元,但它们在设计理念、功能和应用上存在显著区别。简单来说,利润中心是更现代
在 SAP 系统中,利润中心(Profit Center)和业务范围(Business Area)都是用于内部管理报告的组织单元,但它们在设计理念、功能和应用上存在显著区别。简单来说,利润中心是更现代、更灵活、功能更强…...
告别杀后台!深度评测Ba-KeepAlive-U:这款UniAppX安卓保活插件到底有多强?(附多机型测试结果)
Ba-KeepAlive-U技术解析:如何为UniAppX应用实现跨机型保活方案 在移动应用开发领域,后台进程存活率一直是困扰开发者的技术难题。尤其对于需要持续运行定位、即时通讯或数据同步功能的应用,系统资源管理策略导致的"杀后台"现象直接…...
大模型小白入门指南:从工作原理到实用技巧(收藏版)
本文深入解析了大语言模型(LLM)的核心工作原理,包括Transformer架构的自注意力机制和位置编码,以及预训练和指令微调的训练范式。同时,文章还提供了实用的提示工程技巧,帮助读者更好地与AI协作。此外&#…...
SpringBoot+Tess4j:轻松实现OCR功能
一、引言二、功能演示三、功能实现1. 描述2. 编码实现四、源码五、结束语一、引言你是否曾遇到过这样的情况:看到一段有用的文本,想要快速复制下来,却只能眼巴巴地盯着屏幕,手动输入?其实,Java 也可以轻松实…...
2024通信工程师初级备考指南:综合能力与专业实务核心考点解析
1. 2024通信工程师初级考试概况 2024年通信工程师初级资格考试定于9月28日举行,采用机考形式,考试时间为上午8:30至12:30,总时长4小时。这个考试分为两个科目:《通信专业综合能力》和《通信专业实务》,两科连续考试&am…...
别再自己造轮子了!用Qt的QModbusTcpClient库5分钟搞定Modbus TCP通讯
别再重复造轮子!用Qt的QModbusTcpClient库5分钟实现工业级Modbus TCP通信 在工业自动化领域,Modbus TCP协议因其简单可靠的特点,已成为PLC与上位机通信的事实标准。许多Qt开发者面对Modbus通信需求时,第一反应往往是手动封装协议栈…...
多平台资源下载解决方案:res-downloader实现数字内容自由获取
多平台资源下载解决方案:res-downloader实现数字内容自由获取 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...
ESP32S3-Cam + MPU6050 DMP移植避坑实录:从编译报错到姿态数据稳定输出的完整流程
ESP32S3-Cam与MPU6050 DMP移植实战:从编译报错到稳定姿态解算的全流程解析 当ESP32S3-Cam遇上MPU6050的DMP(数字运动处理器)功能,本应是物联网项目中实现低成本姿态检测的完美组合。但实际移植过程中,开发者往往会遭遇…...
4个革新性步骤:NHSE动物森友会存档编辑器完全指南
4个革新性步骤:NHSE动物森友会存档编辑器完全指南 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE(动物森友会存档编辑器)作为一款开源免费工具,…...
初识Git,带你深入学习Git相关的知识
在之前的博客中,我都会在博客的开头放一个gitee的链接。Gitee是什么呢?它是一个远程的代码托管库。在我们学习和项目管理的时候起着非常重要的作用。 本期我就带领着大家一起学习Git相关的知识内容。学习它的操作,了解其在企业级开发中的作用…...

