【qt】平面CAD(计算机辅助设计 )项目 上

一.前言

用我们上节课刚刚学过的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);//添加的设置选中
}

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

六.总结

在这里插入图片描述

因时间有限,我们先完成一半!
图形项的添加基本一致.

  • 先创建一个图形项
  • 设置标识,可以移动
  • 设置画刷或者画笔
  • 设置堆叠等级
  • 设置数据
  • 随机设置位置
  • 创建添加图形项
  • 清空原来的选择
  • 设置现在添加的选择

一生摘叶,不知寻根!

最近更新

  1. TCP协议是安全的吗?

    2024-06-15 06:02:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-15 06:02:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-15 06:02:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-15 06:02:03       20 阅读

热门阅读

  1. Spring框架的原理及应用详解(一)

    2024-06-15 06:02:03       8 阅读
  2. 数据库的隔离级别

    2024-06-15 06:02:03       8 阅读
  3. leetcode 70.爬楼梯

    2024-06-15 06:02:03       10 阅读
  4. 每周题解:Intervals(区间)

    2024-06-15 06:02:03       11 阅读
  5. dolphinscheduler独立集群部署文档(海豚调度)

    2024-06-15 06:02:03       9 阅读
  6. C# —— 三目运算符及实例

    2024-06-15 06:02:03       7 阅读
  7. python 多线程条件竞争利用失败print不显示的原因

    2024-06-15 06:02:03       10 阅读
  8. 与君共勉:坚持+努力

    2024-06-15 06:02:03       10 阅读
  9. ReentrantLock与AQS:深入剖析多线程同步的艺术

    2024-06-15 06:02:03       13 阅读
  10. 快速上手:如何在npm发布自己的插件包

    2024-06-15 06:02:03       12 阅读