[Qt5] 实现CAD中的十字标辅助线效果

简介: [Qt5] 实现CAD中的十字标辅助线效果

👀 前言

十字标辅助线3D雷达点云标注和2D分类中常用的辅助标注工具。这个效果在经典的CAD软件中很常用,还有一些股票软件,也有这种十字线定位线,有时候需要在十字交叉地方获取对应点的数据来显示等。如下,是海康相机客户端MVS中的十字标辅助线效果,本文仿照其效果使用Qt来进行实现。


💨 方式一:重构drawForeground()函数

这种方法主要是在继承基类QGraphicsView的子类MF_GraphicsView中完成,通过重写drawForeground()函数功能,运行时系统会自动调用该函数,最终实现QWidget窗体中绘制红色十字前景函数的自动触发。

核心代码:

//.h——头文件
class MF_GraphicsView :public QGraphicsView
{
public:
  MF_GraphicsView(QWidget* _parent = nullptr);
   ~MF_GraphicsView();
protected:
  //QGraphicsView重构函数
  virtual void drawForeground(QPainter *painter, const QRectF &rect);
}
//.cpp——源文件
void MF_GraphicsView::drawForeground(QPainter *painter, const QRectF &rect)
{    
  QRectF rt = scene()->sceneRect();  //获取场景大小的绘制面积
  QPen _pen;
  _pen.setColor(QColor(255,0,0));
  _pen.setWidth(2);
  painter->setPen(_pen);
  //绘制两条红色十字交叉线
  painter->drawLine(QLine(QPoint(rt.center().x(), 0), QPoint(rt.center().x(), rt.height())));
  painter->drawLine(QLine(QPoint(0, rt.center().y()), QPoint(rt.width(), rt.center().y())));
}

强调:该函数drawForeground()所在的类需要继承基类QGraphicsView。其声明函数前写不写virtual都可以,因为基类中的drawForeground()函数是虚函数,所以子类同名函数默认是虚函数。


💨 方式一:效果展示

参考帖子中的问答:https://bbs.csdn.net/topics/392435787

问题:重写QGraphicsView类,在类中重写paintEvent调用Qpainter的drawRect方法绘制矩形,单步调试,确定执行了drawRect, 但是发现绘制无效,哪位可以解答这是为什么?

解答:

1、别使用它的paintEvent(),要绘制图形需要重写GGraphicsItem中的paint()纯虚函数。或者也可以覆盖写QGraphicsView的drawBackground()或drawForeground()函数。

2、为什么要在view中重写paintEvent…一般是在scene上加item,然后重写item的paint 。


💦 方式二:手动添加辅助线——addLine

方式一是系统运行时,自动执行drawForeground函数来添加辅助线的,后面我想的是通过右键菜单的方式来手动添加和取消,所以我又换了一种方式

核心代码:

//.h
public:
void dispCrossLine();
private:
QGraphicsLineItem *m_HLineItem = nullptr;
QGraphicsLineItem *m_VLineItem = nullptr;
//.cpp
void MF_GraphicsView::dispCrossLine()
{
  if (m_HLineItem == nullptr && m_VLineItem == nullptr) {
    m_HLineItem = new QGraphicsLineItem;
    m_VLineItem = new QGraphicsLineItem;
    m_HLineItem = m_scene->addLine(-m_view->viewport()->width(), 0, m_view->viewport()->width(), 0, QPen(Qt::red, 1));      //左右线
    m_VLineItem = m_scene->addLine(0, -(m_view->viewport()->height()), 0, m_view->viewport()->height(), QPen(Qt::red, 1));  //上下线 
  }
  else {
    m_scene->removeItem((QGraphicsItem*)m_HLineItem);
    m_scene->removeItem((QGraphicsItem*)m_VLineItem);
    delete m_HLineItem;
    m_HLineItem = nullptr;
    delete m_VLineItem;
    m_VLineItem = nullptr;
  }
}

强调:该函数也是在自定义的QGraphicsView的子类中完成的。这样,通过在菜单相应槽函数中直接调动实现函数dispCrossLine可实现手动添加/取消十字标辅助线。


💦 方式二:效果展示


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。


目录
相关文章
|
5月前
【qt】平面CAD(计算机辅助设计 )项目 上
【qt】平面CAD(计算机辅助设计 )项目 上
60 0
|
5月前
【qt】CAD下
【qt】CAD下
47 0
|
6月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
208 1
|
5月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
128 0
|
4月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
101 0
|
4月前
|
5月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
224 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
5月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01
|
5月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03