QT实现鼠标绘制一个矩形

Qt+Vs实现鼠标绘制一个矩形,主要通过自定义QGraphicsItem实现。这里只介绍如何简单快速实现绘制,不涉及太多原理。

1.坐标关系

使用绘图,QGraphicsView(视图)、QGraphicsScene(场景)和QGraphicsItem(图元)之间的坐标关系十分重要。

简单来说,view相当于画框,scene相当于画布,item是画布上的画。

默认情况下,view、scene和item的坐标原点都在左上角。它们之前的坐标关系可以通过mapToscene、mapfromscene函数来相互转换。

2.自定义矩形图元

想要鼠标绘制一个矩形item,首先要明白鼠标事件(例如mousePressEvent)在view、scene和item中的哪一个里面重写。鼠标绘制矩形item,实际上就是实时重新定义矩形item的形状。因此,要在图元item中重写鼠标事件。

2.1重写paint和boungingRect

继承QGraphicsItem,一定要重写纯虚函数paint和boundingRect

boundingRect函数非常重要,它确定鼠标绘制的范围,如果鼠标不在绘制范围内绘制矩形,界面就没有任何反应。

painter是用来绘制矩形的,只要将矩形参数传入该函数,就能进行绘制。

QRectF myItem::boundingRect()const
{
	return m_boundingrect;//设定绘图区域范围
}

void myItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
	painter->setPen(Qt::red);//设置画笔颜色
	painter->drawRect(m_rect);//绘制矩形
}

2.2重写鼠标事件

鼠标事件实时获取矩形Item的起始点和终止点,并实时绘制。mousePressEvent函数获取矩形起始点,mouseMoveEvent函数用来获取矩形终止点并进行重绘。mouseRelease函数停止重绘,确定最终矩形。


void myItem::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
	if (event->button() == Qt::LeftButton)
	{
		if (m_flag == 0)
		{
			m_startPoint = event->scenePos();//获取绘图起始点坐标
			m_flag = 1;//设置绘图状态
		}

	}
}

void myItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
	if (m_flag==1)
	{
		m_endPoint = event->scenePos();
		m_rect = QRectF(m_startPoint, m_endPoint);
		scene()->update();//重绘
	}
}

void myItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
	m_flag = 0;
}

3.主窗口函数初始化场景和图元

在主窗口函数中,初始化场景和自定义矩形图元。并通过setSceneaddItem互相绑定。

BlogDrawSystem::BlogDrawSystem(QWidget* parent)
    : QMainWindow(parent),
    m_myItem(MyRectItem(QRectF(0, 0, 1000, 1000))),
    m_scene(QGraphicsScene())
{
    ui.setupUi(this);

    ui.graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关闭竖直滑动条
    ui.graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关闭水平滑动条

    ui.graphicsView->setScene(&m_scene);//视图绑定场景
    m_scene.addItem(&m_myItem);//场景绑定自定义Rect图元
}

4.源码

【免费】重写QGraphicsItem实现手动简单绘制矩形资源-CSDN文库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值