QT可通过控制点改变大小的矩形框

QT可通过控制点改变大小的矩形框

源码下载链接:https://download.csdn.net/download/weixin_43607300/14094294

效果如下:
在这里插入图片描述
部分代码

#include "DrawRect.h"


DrawRect::DrawRect(QRect rect)
{
	codec = QTextCodec::codecForName("gbk");	
	m_Rect = rect;
	//创建控制点
	newControlPoint();
}

DrawRect::DrawRect(int x, int y, int wide, int heght)
{
	codec = QTextCodec::codecForName("gbk");
	m_Rect.setX(x);
	m_Rect.setY(y);
	m_Rect.setWidth(wide);
	m_Rect.setHeight(heght);
	//创建控制点
	newControlPoint();
}

DrawRect::~DrawRect()
{
}

void DrawRect::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
	painter->setPen(m_pen);
	painter->drawRect(m_Rect);

	if (this->isSelected())
	{//判断是否选中
		QPen pen;
		pen.setWidth(1);
		pen.setColor(Qt::green);
		painter->setPen(pen);
		painter->drawRect(m_Rect);
		if (selectedState == false) displayItems();
		selectedState = true;
		m_unm = 0;
		return;
	}
	selectedState = false;
	m_unm++;
	if (m_unm > 1)
	{
		diddenItems();
	}
}

void DrawRect::setRect(QRect rect)
{
	this->m_Rect = rect;
	DrawControlPoints();
	update();
}

void DrawRect::setPen(QPen pen)
{
	m_pen = pen;
	DrawControlPoints();
}

void DrawRect::displayItems()
{
	QList<QGraphicsItem *> ItemChicl = this->childItems();
	QGraphicsItem *item;
	for (int i = 0; i < ItemChicl.count(); i++)
	{
		item = ItemChicl.at(i);
		item->setVisible(true);
	}

}

void DrawRect::diddenItems()
{
	QList<QGraphicsItem *> ItemChicl = childItems();
	QGraphicsItem *item;

	for (int i = 0; i < ItemChicl.count(); i++)
	{
		item = ItemChicl.at(i);
		item->setVisible(false);
	}
}

void DrawRect::DrawControlPoints()
{
	const QRectF &rect = this->boundingRect();
	QList<QGraphicsItem *> ItemChicl = childItems();
	DrawItem *item;

	for (int i = 0; i < ItemChicl.count(); i++) 
	{
		item = qgraphicsitem_cast<DrawItem *>( ItemChicl.at(i));
		item->setRect(QRect(0, 0, m_pen.width(), m_pen.width()));
		switch (item->m_ItemID)
		{
		case Direction::LeftTop:
			item->setPos(rect.x() - penWidth / 2, rect.y() - penWidth / 2);
			break;
		case Direction::Top:
			item->setPos(rect.x() + rect.width() / 2 - penWidth / 2, rect.y() - penWidth / 2);
			break;
		case Direction::RightTop:
			item->setPos(rect.x() + rect.width() - penWidth / 2, rect.y() - penWidth / 2);
			break;
		case Direction::Right:
			item->setPos(rect.x() + rect.width() - penWidth / 2, rect.y() + rect.height() / 2 - penWidth / 2);
			break;
		case Direction::RightBottom:
			item->setPos(rect.x() + rect.width() - penWidth / 2, rect.y() + rect.height() - penWidth / 2);
			break;
		case Direction::Bottom:
			item->setPos(rect.x() + rect.width() / 2 - penWidth / 2, rect.y() + rect.height() - penWidth / 2);
			break;
		case Direction::LeftBottom:
			item->setPos(rect.x() - penWidth / 2, rect.y() + rect.height() - penWidth / 2);
			break;
		case Direction::Left:
			item->setPos(rect.x() - penWidth / 2, rect.y() + rect.height() / 2 - penWidth / 2);
			break;
		//case Direction::Center:
		//	hndl->move(rect.center().x() - selection_handle_size / 2, rect.center().y() - selection_handle_size / 2);
		//	break;
		default:
			break;
		}
	}

}

void DrawRect::changeIcon(DrawItem *item)
{
// 	switch (item->m_ItemID)
// 	{
// 	case Direction::LeftTop:
// 		item->setCursor(Qt::SizeFDiagCursor);
// 		break;
// 	case Direction::Top:
// 		item->setCursor(Qt::SizeVerCursor);
// 		break;
// 	case Direction::RightTop:
// 		item->setCursor(Qt::SizeBDiagCursor);
// 		break;
// 	case Direction::Right:
// 		item->setCursor(Qt::SizeHorCursor);
// 		break;
// 	case Direction::RightBottom:
// 		item->setCursor(Qt::SizeFDiagCursor);
// 		break;
// 	case Direction::Bottom:
// 		item->setCursor(Qt::SizeVerCursor);
// 		break;
// 	case Direction::LeftBottom:
// 		item->setCursor(Qt::SizeBDiagCursor);
// 		break;
// 	case Direction::Left:
// 		item->setCursor(Qt::SizeHorCursor);
// 		break;
// 		//case Direction::Center:
// 		//	hndl->move(rect.center().x() - selection_handle_size / 2, rect.center().y() - selection_handle_size / 2);
// 		//	break;
// 	default:
// 		break;
// 	}
}

void DrawRect::newControlPoint()
{
	//创建控制点
	ControlRect = new QRect(0, 0, m_pen.width()+2, m_pen.width() + 2);
	this->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
	for (int i = 0; i < Direction::None; i++)
	{
		DrawItem *item = new DrawItem(qgraphicsitem_cast<QGraphicsItem *>(this), *ControlRect);
		item->m_ItemID = static_cast<Direction>(i);
		item->setVisible(false);
	}
	DrawControlPoints();
	this->setCursor(Qt::SizeAllCursor);

	//设置鼠标悬停事件开
	this->setAcceptHoverEvents(true);
}

void DrawRect::resize(QPoint &point , DrawItem *item)
{		
	QPoint local = mapFromScene(point).toPoint();
	if (item == nullptr)
	{
		return;
	}
	QString dirName;
	QRect delta = m_Rect;
	switch (item->m_ItemID)
	{
	case Direction::LeftTop:
		delta.setTopLeft(local);
		break;
	case Direction::Top:
		dirName = "Top";
		delta.setTop(local.y());
		break;

	case Direction::RightTop:
		dirName = "RightTop";
		delta.setTopRight(local);
		break;

	case Direction::Left:
		dirName = "Left";
		delta.setLeft(local.x());
		break;
	case Direction::Right:
		dirName = "Rigth";
		delta.setRight(local.x());
		break;

	case Direction::LeftBottom:
		dirName = "LeftBottom";
		delta.setBottomLeft(local);
		break;

	case Direction::Bottom:
		dirName = "Bottom";
		delta.setBottom(local.y());
		break;

	case Direction::RightBottom:
		dirName = "RightBottom";
		delta.setBottomRight(local);
		break;
	default:
		break;
	}
	m_Rect = delta;
	DrawControlPoints();
}

QRectF DrawRect::boundingRect() const
{
	QRectF rectf;
	rectf.setX(m_Rect.x());
	rectf.setY(m_Rect.y());
	rectf.setWidth(m_Rect.width());
	rectf.setHeight(m_Rect.height());
	return rectf;
}

void DrawRect::mousePressEvent(QGraphicsSceneMouseEvent * event)
{
	QGraphicsItem::mousePressEvent(event);
}

void DrawRect::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
{
	QGraphicsItem::mouseMoveEvent(event);
}

void DrawRect::hoverEnterEvent(QGraphicsSceneHoverEvent * event)
{
	QGraphicsItem::hoverEnterEvent(event);
}


代码太长喜欢的朋友可下载一同学习。有详细的备注。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流浪的猪头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值