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.主窗口函数初始化场景和图元
在主窗口函数中,初始化场景和自定义矩形图元。并通过setScene和addItem互相绑定。
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图元
}