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);
}
代码太长喜欢的朋友可下载一同学习。有详细的备注。