#include "DrawROI.h"
DrawROI::DrawROI(QGraphicsView* GraphicsView, QObject*parent)
: QObject(parent)
{
m_graphicsView = GraphicsView;
m_isDrawMultipROIS = false;
isROIBeginChange = false;
m_currentROIIndex = 0;
initViewer();
}
DrawROI::~DrawROI()
{
}
void DrawROI::drawROI()
{
if (m_pixmap.isNull())
return;
for (int i = 0; i < m_rois.size(); i++)
{
QPen pen;
pen.setColor(Qt::red);
pen.setWidth(EDGE_WIDTH);
QFont font;
font.setPixelSize(12); //设置字体大小
QPainter painter(m_graphicsView->viewport());
painter.begin(m_graphicsView); //绘画开始
painter.setBrush(QBrush(QColor(0, 0, 200, 20))); //画刷填充框内颜色
painter.setPen(pen);
painter.setFont(font);
//roi图元坐标转视图坐标,因为画roi是按视图坐标画的
QPoint roiViewPoint = m_graphicsView->mapFromScene(m_rois[i].x(), m_rois[i].y());
QRect roi(roiViewPoint.x(), roiViewPoint.y(), m_rois[i].width(), m_rois[i].height());
//QPixmap rawImg = m_pixmap.scaled(m_graphicsView->size(), Qt::KeepAspectRatio);
// QPixmap rawImg = m_pixmap;
QString strPoint = QString("X:%0, Y:%1").arg(m_rois[i].x()).arg(m_rois[i].y()); //roi位置信息
QString strSize = QString("W:%0, H:%1").arg(m_rois[i].width()).arg(m_rois[i].height()); //roi大小信息
std::map<int, QRect>::iterator it = m_rois.begin();
for (int j = 0; j < i; j++)
{
it++;
}
QString roiIndex = QString("#roi:%0").arg(it->first); //roi序号
painter.drawText(roi.topLeft().x(), roi.topLeft().y() - 5, strSize);
painter.drawText(roi.topLeft().x(), roi.topLeft().y() - 18, strPoint);
painter.drawText(roi.topLeft().x(), roi.topLeft().y() - 31, roiIndex);
// painter.drawRect(m_roiRect);
painter.drawRect(roi);
if (m_rois[i].width() != 0 && m_rois[i].height() != 0)
{
//绘制中间十字架
QPen dashPen(Qt::white);
dashPen.setWidth(MIDDLELINE_WIDTH);
dashPen.setStyle(Qt::DashDotLine);
painter.setPen(dashPen);
//从上往下画线,获取roi的y坐标始终为线宽的上边
painter.drawLine(roi.topLeft().x() + m_rois[i].width() / 2, roi.topLeft().y() + EDGE_WIDTH, roi.bottomRight().x() - m_rois[i].width() / 2, roi.bottomRight().y());
//从左往右画线, 获取roi的x坐标始终是线宽的左边
painter.drawLine(roi.topLeft().x() + EDGE_WIDTH, roi.topLeft().y() + m_rois[i].height() / 2, roi.bottomRight().x(), roi.bottomRight().y() - m_rois[i].height() / 2);
//绘制边缘九个点
//painter.setBrush(Qt::green);
//pen.setWidth(0);
//painter.setPen(pen);
//painter.drawRect(m_roiRect.topLeft().x(), m_roiRect.topLeft().y(), POINT_WIDTH, POINT_HEIGHT); //左上角
//painter.drawRect(m_roiRect.topLeft().x(), m_roiRect.topLeft().y() + m_roiRect.height() / 2 - POINT_HEIGHT / 2, POINT_WIDTH, POINT_HEIGHT); //左边中心点
//painter.drawRect(m_roiRect.bottomLeft().x(), m_roiRect.bottomLeft().y() - POINT_HEIGHT, POINT_WIDTH, POINT_HEIGHT); //左下角
//painter.drawRect(m_roiRect.topLeft().x() + m_roiRect.width() / 2 - POINT_WIDTH / 2, m_roiRect.topLeft().y(), POINT_WIDTH, POINT_HEIGHT); //顶部中心
//painter.drawRect(m_roiRect.topLeft().x() + m_roiRect.width() / 2 - POINT_WIDTH / 2, m_roiRect.topLeft().y() + m_roiRect.height() / 2 - POINT_HEIGHT / 2, POINT_WIDTH, POINT_HEIGHT); //中心点
//painter.drawRect(m_roiRect.bottomLeft().x() + m_roiRect.width() / 2 - POINT_WIDTH / 2, m_roiRect.bottomLeft().y() - POINT_HEIGHT, POINT_WIDTH, POINT_HEIGHT); //底部中心点
//painter.drawRect(m_roiRect.topRight().x() - POINT_WIDTH, m_roiRect.topRight().y(), POINT_WIDTH, POINT_HEIGHT); //右上角
//painter.drawRect(m_roiRect.topRight().x() - POINT_WIDTH, m_roiRect.topRight().y() + m_roiRect.height() / 2 - POINT_HEIGHT / 2, POINT_WIDTH, POINT_HEIGHT); //右边中心点
//painter.drawRect(m_roiRect.bottomRight().x() - POINT_WIDTH, m_roiRect.bottomRight().y() - POINT_HEIGHT, POINT_WIDTH, POINT_HEIGHT); //右下角点
}
//绘画结束
painter.end();
m_graphicsView->viewport()->update();
}
}
void DrawROI::changeROIBegin(const QPoint& point)
{
//场景坐标
QPointF fScenePoint = m_graphicsView->mapToScene(point);
//图形项坐标
QGraphicsItem* pItem = m_graphicsView->scene()->itemAt(fScenePoint, QTransform());
if (NULL == pItem)
{
isBeginGraw = false;
return;
}
isBeginGraw = true;
QPointF fItemPoint = pItem->mapFromScene(fScenePoint); //获取图形项坐标
QPoint itemPoint(fItemPoint.x(), fItemPoint.y());
EmDirection dir = region(itemPoint); //获取鼠标当前的坐标在ROI什么位置
m_currentDir = dir;
isROIBeginChange = true;
if (dir == DIR_MIDDLE)
{
//鼠标在矩形中心位置
m_graphicsView->setCursor(Qt::ClosedHandCursor);
m_moveStartPoint.setX(itemPoint.x());
m_moveStartPoint.setY(itemPoint.y());
m_bMovedPressed = true;
}
else if (dir == DIR_NONE)
{
//鼠标在矩形外部
m_graphicsView->setCursor(Qt::ArrowCursor);
m_bPainterPressed = true;
m_paintStartPoint.setX(itemPoint.x());
m_paintStartPoint.setY(itemPoint.y());
m_currentROIIndex = m_rois.size(); //更新roi序号
}
else
{
//鼠标在矩形边缘
m_moveStartPoint.setX(itemPoint.x());
m_moveStartPoint.setY(itemPoint.y());
m_bScalePressed = true;
m_emCurDir = dir;
}
}
void DrawROI::changeROIInProgress(const QPoint& point)
{
if (!isBeginGraw) return;
QPointF fScenePoint = m_graphicsView->mapToScene(point);
//图形项坐标
QGraphicsItem* pItem = m_graphicsView->scene()->itemAt(fScenePoint, QTransform());
QPoint itemPoint;
if (pItem != NULL)
{
QPointF fItemPoint = pItem->mapFromScene(fScenePoint); //获取图形项坐标
QPoint item(fItemPoint.x(), fItemPoint.y());
itemPoint = item;
}
else
{
//绘制roi超过图像边界进行处理
if (fScenePoint.x() < 0 && fScenePoint.y() < 0)
{
QPoint item(0, 0);
itemPoint = item;
}
else if (fScenePoint.x() < 0)
{
QPoint item(0, fScenePoint.y());
itemPoint = item;
}
else if (fScenePoint.y() < 0)
{
QPoint item(fScenePoint.x(), 0);
itemPoint = item;
}
else if (fScenePoint.x() >= m_pixmap.width() && fScenePoint.y() >= m_pixmap.height())
{
QPoint item(m_pixmap.width() - 1, m_pixmap.height() - 1);
itemPoint = item;
}
else if (fScenePoint.x() >= m_pixmap.width())
{
QPoint item(m_pixmap.width() - 1, fScenePoint.y());
itemPoint = item;
}
else if (fScenePoint.y() >= m_pixmap.height())
{
QPoint item(fScenePoint.x(), m_pixmap.height() - 1);
itemPoint = item;
}
}
if (m_bPainterPressed)
{
//正在绘制状态
paintRect(itemPoint);
}
else if (m_bMovedPressed)
{
//判断拖动roi是否超过图像边界
if ((m_rois[m_currentROIIndex].x() <= 0 && m_rois[m_currentROIIndex].y() <= 0))
{
m_rois[m_currentROIIndex].setX(0);
m_rois[m_currentROIIndex].setY(0);
}
else if ((m_rois[m_currentROIIndex].x() <= 0))
{
m_rois[m_currentROIIndex].setX(0);
}
else if ((m_rois[m_currentROIIndex].y() <= 0))
{
m_rois[m_currentROIIndex].setY(0);
没有合适的资源?快使用搜索试试~ 我知道了~
(GraphicsView,QPainter,QGraphicsRectItem)QT用鼠标绘制矩形
共16个文件
h:5个
cpp:5个
vcxproj:1个
需积分: 5 66 下载量 83 浏览量
2023-11-10
09:00:29
上传
评论 4
收藏 18KB ZIP 举报
温馨提示
这是一个QT的demo,可以用鼠标进行矩形的绘制,根据这个demo也可以绘制出其他的多边形 QT版本:5.15.2 VS版本:2019 1、鼠标绘制一个或多个矩形 2、鼠标放在矩形上可以按住拖动 3、鼠标放在矩形边缘可以拉长或拉短矩形的宽高 4、按住ctrl,滑动滚轮可以放大缩小矩形 5、鼠标右键矩形可以删除、保存 用法链接:https://menghui666.blog.csdn.net/article/details/134303558?spm=1001.2014.3001.5502 微博主页:https://menghui666.blog.csdn.net/
资源推荐
资源详情
资源评论
收起资源包目录
drawROI.zip (16个子文件)
GraphicsViewTool.h 853B
testString.h 1KB
DrawROI.h 4KB
resource.h 389B
testString.cpp 2KB
testString.vcxproj 6KB
DrawROI.cpp 25KB
GraphicsView.cpp 8KB
main.cpp 191B
GraphicsViewTool.cpp 3KB
testString.qrc 70B
testString.rc 1KB
GraphicsView.h 2KB
testString.vcxproj.filters 2KB
testString.ui 815B
testString.vcxproj.user 560B
共 16 条
- 1
资源评论
梦回阑珊
- 粉丝: 2479
- 资源: 632
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功