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

  • 📢博客主页:https://blog.csdn.net/weixin_43197380
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Loewen丶原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨


👀 前言

十字标辅助线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可实现手动添加/取消十字标辅助线。


💦 方式二:效果展示

在这里插入图片描述


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。
  • 33
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 66
    评论
Qt实现画线笔锋效果,可以使用QPainter来进行绘制。首先,我们需要创建一个QPainter对象,并通过设置绘制属性来实现笔锋效果。 1. 创建一个QWidget或QFrame的子类,并重写其paintEvent函数。在paintEvent函数,创建QPainter对象,然后通过调用QPainter的函数来实现绘制。 ```cpp void MyWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); // 抗锯齿 painter.setPen(QPen(Qt::black, 5)); // 设置画笔颜色和宽度 // 绘制线条 painter.drawLine(QPoint(50, 50), QPoint(250, 50)); // ... } ``` 2. 在绘制线条之前,可以先通过调用QPainter的setBrush函数设置画刷,以实现线条的渐变效果。可以使用QLinearGradient或QRadialGradient来创建渐变对象,并设置渐变的起始和终止颜色。 ```cpp QLinearGradient gradient(QPointF(50, 50), QPointF(150, 50)); gradient.setColorAt(0, Qt::black); // 起始颜色 gradient.setColorAt(1, Qt::white); // 终止颜色 painter.setBrush(gradient); ``` 3. 为了实现笔锋效果,我们可以绘制多个路径,并逐渐改变线条宽度。可以使用QPainterPath来创建路径对象,并通过调用QPainter的drawPath函数进行绘制。 ```cpp QPainterPath path; path.moveTo(50, 50); path.lineTo(150, 100); path.lineTo(250, 50); for (int i = 0; i < 10; i++) { painter.setPen(QPen(Qt::black, i)); // 设置不同宽度的线条 painter.drawPath(path); } ``` 最后,根据具体需求,可以在绘制之前设置其他属性,如线条的样式、笔触的形状等。以上是一个简单的实现画线笔锋效果的示例,根据实际情况可以做出相应调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 66
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶布布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值