在视图画矩形并处理鼠标在矩形上的操作

QGraphicsView通过鼠标操作来绘制图元 在Visio和MindManager等类似的图元操作软件中,很多时候我们会通过鼠标操作来添加自定义的图元。这里就介绍一下如何在QT的图形视图框架中通过鼠标绘制来添加图元。 阅读详情

#define     RECT_VRT_MOVE    0x01        //垂直移动
#define     RECT_HRN_MOVE    0x02        //水平移动
#define     ROUND            0x04
class CRectObject
{
public:
    CRectObject(void);
    ~CRectObject(void);
    enum CursorMode
    {
        WECursor    =0x00,                //鼠标在矩形东西时的形状模式
        NSCursor    =0x01,                //鼠标在矩形南北时的形状模式
        AllCursor    =0x02,                //鼠标在矩形四个角时的形状模式
        InCursor    =0x03,                //鼠标在矩形内部时的形状模式
        OutCursor    =0x04                //鼠标在矩形外部时的形状模式
    };
    enum Operator
    {
        RECT_MOVE    =0x01,                //移动信息框
        RECT_RESIZE    =0x02,                //改变信息框的大小
        RECT_NULL    =0xFF                //没有操作
    };
    enum ResizeMode
    {
        WE_RESIZE=0x00,
        NS_RESIZE=0x01,
        ALL_RESIZE=0x02
    };
public:   

    /**********************************************************************************
    **函数名称:SetStyle

    **函数功能:设置矩形风格

    **入口参数:style :风格

    **出口参数:无

    **特殊说明:矩形风格有RECT_VRT_MOVE(垂直移动)RECT_HRN_MOVE(水平移动)

    **开 发 者:miaozhengwei

    **创建日期:2010-07-30
    ************************************************************************************/
    void    SetStyle(UINT32 style){m_Style=style;}
    /**********************************************************************************
    **函数名称:SetActiveRange

    **函数功能:设置矩形的活动范围

    **入口参数:rt    :矩形的活动范围

    **出口参数:无

    **特殊说明:

    **开 发 者:miaozhengwei

    **创建日期:2010-07-29
    ************************************************************************************/
    void    SetActiveRange(CRect rt);                            //设置信息窗口的活动范围   
    void    GetActiveRange(CRect & rt){rt=m_rtActive;}
    /**********************************************************************************
    **函数名称:SetRectCursor

    **函数功能:设置鼠标在矩形周围的形状

    **入口参数:mode    :鼠标在矩形周围的模式
               hCursor:鼠标的形状名柄

    **出口参数:无

    **特殊说明:鼠标与矩形位置有四种 WECursor(东西)NSCursor(南北)AllCursor(四角)
               InCursor(内部)OutCursor(外部)

    **开 发 者:miaozhengwei

    **创建日期:2010-07-29
    ************************************************************************************/
    void    SetRectCursor(CursorMode mode,HCURSOR hCursor);

    /**********************************************************************************
    **函数名称:GetRectCursor

    **函数功能:获取鼠标在矩形周围的形状

    **入口参数:pt    :鼠标当前的位置

    **出口参数:鼠标形状句柄

    **特殊说明:鼠标与矩形位置有四种 WECursor(东西)NSCursor(南北)AllCursor(四角)
                InCursor(内部)OutCursor(外部)

    **开 发 者:miaozhengwei

    **创建日期:2010-07-29
    ************************************************************************************/
    HCURSOR GetRectCursor(CPoint pt);

    void    ClientConvert(CRect & rt);
public:        //message handle

    /**********************************************************************************
    **函数名称:OnDraw

    **函数功能:画矩形

    **入口参数:pDC    :

    **出口参数:无

    **特殊说明:由视图中的OnDraw或OnPaint函数来调用,如何绘制由子类决定

    **开 发 者:miaozhengwei

    **创建日期:2010-07-29
    ************************************************************************************/
    virtual void    OnDraw(CDC * pDC)=0;                                    //

    /**********************************************************************************
    **函数名称:MouseMove

    **函数功能:处理鼠标在矩形周围移动

    **入口参数:

    **出口参数:返回TRUE时,需要调用者刷新视图,false不用

    **特殊说明:由WM_MOUSEMOVE消息处理

    **开 发 者:miaozhengwei

    **创建日期:2010-07-29
    ************************************************************************************/

    virtual BOOL    MouseMove(UINT nFlags, CPoint point);
    /**********************************************************************************
    **函数名称:LButtonDown

    **函数功能:鼠标左键按下处理

    **入口参数:

    **出口参数:无

    **特殊说明:由WM_LBUTTONDOWN消息处理

    **开 发 者:miaozhengwei

    **创建日期:2010-07-29
    ************************************************************************************/
    virtual void    LButtonDown(UINT nFlags, CPoint point);

    /**********************************************************************************
    **函数名称:LButtonUp

    **函数功能:鼠标弹起

    **入口参数:

    **出口参数:无

    **特殊说明:由WM_LBUTTONUP消息处理

    **开 发 者:miaozhengwei

    **创建日期:2010-07-29
    ************************************************************************************/
    virtual void    LButtonUp(UINT nFlags, CPoint point);
protected:
    /**********************************************************************************
    **函数名称:SetPos

    **函数功能:设置矩形的位置

    **入口参数:rt    :矩形相对活动区域的位置

    **出口参数:无

    **特殊说明:

    **开 发 者:miaozhengwei

    **创建日期:2010-07-30
    ************************************************************************************/
    void    SetPos(CRect rt);
    /**********************************************************************************
    **函数名称:PointInWndEdge

    **函数功能:判断点是否在矩形边缘

    **入口参数:pt    :鼠标位置

    **出口参数:无

    **特殊说明:

    **开 发 者:miaozhengwei

    **创建日期:2010-07-30
    ************************************************************************************/
    BOOL    PointInWndEdge(CPoint pt);

    /**********************************************************************************
    **函数名称:PointInWnd

    **函数功能:判断点是否在矩形内部

    **入口参数:pt    :鼠标位置

    **出口参数:无

    **特殊说明:

    **开 发 者:miaozhengwei

    **创建日期:2010-07-30
    ************************************************************************************/
    BOOL    PointInWnd(CPoint pt);

    /**********************************************************************************
    **函数名称:AdjustPosition

    **函数功能:调整矩形的位置和大小

    **入口参数:point    :鼠标当前位置

    **出口参数:无

    **特殊说明:

    **开 发 者:miaozhengwei

    **创建日期:2010-07-30
    ************************************************************************************/
    void    AdjustPosition(CPoint point);
protected:
    Operator    m_uState;
    BOOL    m_bLBtnDown;
    CRect    m_rtActive;                    //信息窗口的活动范围
    CRect    m_rtPos;                    //信息在父窗客户区的位置
    HCURSOR m_hWECursor;
    HCURSOR m_hNSCursor;
    HCURSOR m_hAllCursor;
    HCURSOR m_hInCursor;
    HCURSOR m_hOutCursor;
    HCURSOR m_hCurCursor;
    UINT32     m_Style;
    ResizeMode m_ResizeMode;
};

#include "RectObject.h"

CRectObject::CRectObject(void)
{
    m_rtPos=CRect(2,3,300,33);
    m_rtActive=CRect();
    m_bLBtnDown=FALSE;
    m_uState=RECT_NULL;
    m_hWECursor=LoadCursor(NULL,IDC_SIZEWE);
    m_hNSCursor=LoadCursor(NULL,IDC_SIZENS);
    m_hAllCursor=LoadCursor(NULL,IDC_SIZEALL);
    m_hInCursor=LoadCursor(NULL,IDC_HAND);
    m_hOutCursor=LoadCursor(NULL,IDC_ARROW);
    m_hCurCursor=LoadCursor(NULL,IDC_ARROW);
    m_Style=RECT_VRT_MOVE|RECT_HRN_MOVE;
    m_ResizeMode=WE_RESIZE;
}

CRectObject::~CRectObject(void)
{
}

void CRectObject::SetPos( CRect rt )
{
    if(m_Style&RECT_VRT_MOVE)
    {
        m_rtPos.top=rt.top;
        m_rtPos.bottom=rt.bottom;
    }
    if(m_Style&RECT_HRN_MOVE)
    {
        m_rtPos.left=rt.left;
        m_rtPos.right=rt.right;
    }
}

BOOL CRectObject::PointInWndEdge( CPoint pt)
{
    CRect rt=m_rtPos;
    ClientConvert(rt);
    return    (abs(pt.x-rt.left)<10)||(abs(pt.x-rt.right)<10)
          ||(abs(pt.y-rt.top)<10)||(abs(pt.y-rt.bottom)<10);
}

HCURSOR CRectObject::GetRectCursor( CPoint pt )
{
    CRect rt=m_rtPos;
    ClientConvert(rt);
    if(((abs(pt.x-rt.left)<10)||(abs(pt.x-rt.right)<10))        //四角
        &((abs(pt.y-rt.top)<10)||(abs(pt.y-rt.bottom)<10)))
    {
        m_ResizeMode=ALL_RESIZE;
        return    m_hAllCursor;
    }
    if((abs(pt.x-rt.left)<10)||(abs(pt.x-rt.right)<10))            //东西
    {
        m_ResizeMode=WE_RESIZE;
        return    m_hWECursor;
    }
    if((abs(pt.y-rt.top)<10)||(abs(pt.y-rt.bottom)<10))            //南北
    {
        m_ResizeMode=NS_RESIZE;
        return    m_hNSCursor;
    }
    if((pt.x>=(rt.left+10))&&(pt.x<=(rt.right-10))                //内部
     &&(pt.y>=(rt.top+10))&&(pt.y<=(rt.bottom-10)))
        return    m_hInCursor;
    return    m_hOutCursor;                                        //外部
}
BOOL CRectObject::PointInWnd( CPoint pt )
{
    CRect rt=m_rtPos;
    ClientConvert(rt);
    rt.DeflateRect(5,5,5,5);
    return    (pt.x>rt.left)&&(pt.xrt.top)&&(pt.y}

BOOL CRectObject::MouseMove( UINT nFlags, CPoint point )
{
    BOOL bRet=FALSE;
    CPoint pt(point);   
    if(m_uState==RECT_NULL)                            //提示窗口没有操作
    {
        m_hCurCursor=GetRectCursor(pt);
        if(PointInWndEdge(pt))                        //鼠标在边沿
        {   
            if(m_bLBtnDown)
            {
                m_uState=RECT_RESIZE;
                bRet=TRUE;
            }   
        }
        else if(PointInWnd(pt))                        //鼠标在内部
        {
            if(m_bLBtnDown)
            {
                m_uState=RECT_MOVE;
                bRet=TRUE;
            }       
        }
    }
    SetCursor(m_hCurCursor);
    AdjustPosition(point);
    return    bRet;
}
void CRectObject::AdjustPosition( CPoint point )
{
    static CPoint PrePt(0,0);
    CRect rt(m_rtPos);
    switch(m_uState)
    {
    case RECT_RESIZE:
        switch(m_ResizeMode)
        {
        case WE_RESIZE:
            if(abs(m_rtPos.right-point.x)                rt.right=point.x;
            else
                rt.left=point.x;
            break;
        case NS_RESIZE:
            if(abs(m_rtPos.bottom-point.y)                rt.bottom=point.y;
            else
                rt.top=point.y;
            break;
        case ALL_RESIZE:
            if(abs(m_rtPos.right-point.x)                rt.right=point.x;
            else
                rt.left=point.x;
            if(abs(m_rtPos.bottom-point.y)                rt.bottom=point.y;
            else
                rt.top=point.y;
            break;
        }
        SetPos(rt);
        break;
    case RECT_MOVE:
        rt.left+=point.x-PrePt.x;
        rt.right+=point.x-PrePt.x;
        rt.top+=point.y-PrePt.y;
        rt.bottom+=point.y-PrePt.y;
        SetPos(rt);
        break;
    }
    PrePt=point;
}

void CRectObject::LButtonDown( UINT nFlags, CPoint point )
{
    if(PointInWnd(point)||PointInWndEdge(point))
    {
        m_bLBtnDown=TRUE;
    }
    SetCursor(GetRectCursor(point));            //当鼠标点击下后修改鼠标形状
}

void CRectObject::LButtonUp( UINT nFlags, CPoint point )
{
    m_bLBtnDown=FALSE;
    m_uState=RECT_NULL;
}
void CRectObject::SetActiveRange( CRect rt )
{
    if(rt!=m_rtActive)
    {
        m_rtActive=rt;
        SetPos(m_rtPos);
    }
}

void CRectObject::ClientConvert( CRect & rt )
{
    rt.top+=m_rtActive.top;
    rt.left+=m_rtActive.left;
    rt.bottom+=m_rtActive.top;
    rt.right+=m_rtActive.left;
}

void CRectObject::SetRectCursor( CursorMode mode,HCURSOR hCursor )
{
    switch (mode)
    {
    case WECursor:    m_hWECursor=hCursor;    break;
    case NSCursor:    m_hNSCursor=hCursor;    break;
    case AllCursor:    m_hAllCursor=hCursor;    break;
    case InCursor:    m_hInCursor=hCursor;    break;
    case OutCursor:    m_hOutCursor=hCursor;    break;
    }
}

【QT开发教程】绘制矩形组件QGraphicsRectItem详解及实战应用:可指定矩形位置、矩形大小范围、矩形边框画笔颜色、矩形填充画刷颜色 QGraphicsRectItem 是 Qt 中用于简单而高效地绘制矩形的利器。通过掌握它的常用方法、信号槽机制以及各种高级应用技巧,可以轻松实现各种复杂的图形绘制和交互功能。 阅读详情

相关推荐

MFC应用中动态绘制矩形响应WM_MOUSEMOVE的实现教程

在Windows系统中,消息是由Windows消息系统发送给应用程序的消息,应用程序通过消息处理函数来响应这些消息。消息可以是来自用户的,如鼠标点击、按键事件;也可以是系统内部的,如窗口需要重绘或定时器溢出。消息分为好几类,包括窗口消息、控件通知消息、系统命令消息、字体消息、鼠标和键盘消息等。消息的定义通常由一个UINT类型的常量来表示,它们都是预定义的系统常量。例如,WM_PAINT是窗口需要重绘时的处理消息,是鼠标左键被按下时的事件消息。

weixin_35761094的博客 1011

窗口鼠标事件的响应 在鼠标窗口中绘制矩形的程序

这里主要是训练怎么去响应鼠标响应事件,那怎么去定义鼠标响应函数呢? void CvMouseCallback( int event;//鼠标响应事件的类型如鼠标右键弹起,右键按下,CV_EVENT_LBUTTONDOWN,CV_EVENT_LBUTTONDOWN) int

ChampionLai 2804

鼠标消息及其处理实例

实例实现的功能为当用户在视图窗口中按下鼠标左键,拖动鼠标时,在窗口中绘制一个随鼠标位置变化的矩形,当释放鼠标键时,停止矩形绘制。

用鼠标在窗口中绘制矩形

鼠标相应事件采用了回调函数的方式来处理。为了可以响应鼠标事件,首先创建一个回调函数,使得鼠标事件(如移动、点击等)发生时OpenCV可以调用这个函数。创建这个函数之后,还要在OpenCV中注册这个函数。

Steve的备忘录 1518

MFC单文档绘图例程

根据《跟我学VC6.0》教材中的例子编写的单文档绘图软件。内容有:画直线、画圆、随笔画、设置笔色、笔宽、设置填充色等。

c++应用程序,实现用鼠标拖动方式在窗口中画自由曲线,在鼠标拖动画线过程中,当光标设置为十字形。

c++应用程序,实现用鼠标拖动方式在窗口中画自由曲线,在鼠标拖动画线过程中,当光标设置为十字形。

VS2019MFC进行无预览简单绘图:直线,画笔,画刷,矩形,椭圆

1.MFC常用绘图函数 CreatePen 创建画笔;属性:线型、宽度、颜色 CreateSolidBrush 创建画刷,填充封闭图形 SetPixel 绘制像素点,返回RGB值 SetPixelV 绘制像素点,返回0或非0 MoveTo 移动当前位置,绘制直线时确定起点 LineTo 移动直线段,绘制直线时确定终点 Rectangle 绘制矩形 Ellipse 绘制椭圆 FillSolidRect 填充矩形颜色

星辰大海的博客 4431

画出鼠标指向窗口的矩形区域

画出鼠标指向窗口的矩形区域 画出鼠标指向窗口的矩形区域 画出鼠标指向窗口的矩形区域 画出鼠标指向窗口的矩形区域

Avalonia Image控件上通过鼠标拖动画出矩形框

Avalonia

大黄鸭在发光的专栏 1038

【Flink cdc】Data row is smaller than a column index, internal schema representation is probably xxx

翻译一下:当scan.startup.mode=EARLIEST_OFFSET时,如果在最早的offset之后表结构有过变化就无法支持。原因应该是在binlog 的earliest_offset之后,表结构被修改过。我的解决方案:source配置中使用。mysql source配置使用。,以时间戳为消费依据。

integrity 2073

jmeter小白下载安装步骤

本文仅仅简单介绍了jmeter工具的下载安装,以及基础的操作步骤。

昔年@曦的博客 3487

鼠标消息及其处理

鼠标消息是应用程序中常需要开发处理的消息,当鼠标移动,左右键的按下,松开双击操作等都可以产生相应的鼠标消息。     鼠标消息处理实例     实例实现的功能为当用户在视图窗口中按下鼠标左键,拖动鼠标时,在窗口中绘制一个随鼠标位置变化的矩形,当释放鼠标键时,停止矩形绘制。具体开发过程如下:     1创建工程     2  添加鼠标消息映射和响应函数     在ClassWiz

559

线上专利申请(超详细)| 签名确认

在【法人登录】页面点击【证书登录】按钮,弹出证书登录提示框,点击【确 认】按钮,进入到输入证书密码页面,点击【取消】按钮,取消本次操作。企业在提交申请时,需要增加签名,如使用企业账户点击提交,会弹出“法人、代理机构不能签名,请使用经办人签名”,这个时候就需要换个账号了。在需要签名时,将专利官网的登录方式点击法人登录,选择扫码登录,使用移动端经办人账户的扫一扫功能扫描登录。登录完成后,再点击签名,使用移动端扫一扫功能,扫描签名,输入证书号,确认签名,并提交。最后,祝大家的申请都成功!

weixin_62112323的博客 9090

在QGraphicsScene上画矩形

在QGraphicsScene上画矩形 去发现同类优质开源项目:https://gitcode.com/ 此仓库包含了一个使用Qt5框架实现的示例程序,该程序通过继承QGraphicsScene和QGraphicsView,并重写鼠标事件,实现在场景上添加图片并绘制矩形标记特定区域的功能。 描述 资源中的程序CustomSense是为了满足特定需求而设计的小型测试示例。在此示例中,用户可以在场景上...

gitblog_06797的博客 279

基于Codex Skill的抖音爆款分析与带货视频自动化生成实战

这次我们来看一个基于 Codex 的自动化内容创作项目。核心是利用 Codex 平台的能力,通过自定义的 Skill(技能)来拆解抖音爆款博主的视频模式,并自动生成自己的带货视频。对于内容创作者、电商运营或对短视频自动化感兴趣的技术开发者来说,这是一个将大语言模型(LLM)能力与具体业务场景深度结合的实战案例。 项目的核心价值在于流程自动化。它试图解决一个常见痛点:分析爆款视频的脚本结构、话术、节奏需要大量人工,而模仿创作又耗时费力。通过 Codex 的 Skill 机制,可以将“分析”和“生成”这两个环节

weixin_30420305的博客 364

【WRF-Chem教程第四期上】运行 WRF-Chem 模型

完整介绍运行 WRF-Chem 模型的详细步骤

WW、forever的博客 3101

Qt中视图的缩放对应缩略图中矩形框的缩放

本文实现的目的是:视图缩放时,缩略图中的矩形框也进行缩放,而缩略图中的矩形区域为视图中的可见区。 获取视图中滚动条的值,将其值与缩略图所在的小窗口对比,可通过绘图求其比例,再按比例缩小。 首先提供主要的代码: connect(view->verticalScrollBar(),&QScrollBar::valueChanged,this,&chunzhongForm::slot_VvalueChanged); connect(view->horizontalScrollBar()

肩上风骋的博客 1170

26届数字IC秋招笔试面试全攻略-ASIC设计流程全解析

本文系统介绍了ASIC芯片设计的全流程。前端设计包括规格制定、架构设计、RTL编码和功能验证;后端设计完成物理实现,涵盖布局规划、时钟树综合、布线和物理验证等步骤;Tapeout阶段完成制造数据准备和交付。文章详细说明了各阶段的关键任务、验证方法和设计指标,并列举了典型工具链,为ASIC设计提供了全面的流程指导。通过严格的检查清单和验证步骤,确保芯片设计符合制造要求和性能目标。

2301_79143213的博客 364

在QGraphicsScene上画矩形:开启图像标注新篇章

在QGraphicsScene上画矩形:开启图像标注新篇章 去发现同类优质开源项目:https://gitcode.com/ 在当今图像处理与机器学习领域,图像标注是至关重要的一环。今天,我们就来介绍一个功能强大且易于使用的开源项目——在QGraphicsScene上画矩形,它将极大地简化图像标注过程。 项目介绍 在QGraphicsScene上画矩形是一个基于Qt5框架的开源项目,它通过继承QG...

gitblog_06795的博客 1063

玩转Docker | 使用Docker部署MediaCMS内容管理系统

玩转Docker | 使用Docker部署MediaCMS内容管理系统

qq_59334230的博客 2905

计算机组成原理(第三版)唐朔飞-第十章控制单元的设计-课后习题

计算机组成原理(第三版)唐朔飞-第十章控制单元的设计-课后习题

weixin_45735391的博客 3万+

mfc作业单文档程序画矩形直线作业

本次作业参考了此作者,感谢其分享 https://blog.csdn.net/XTAOTWO/article/details/83421023?utm_source=app 代码如下: 框架类: void CMainFrame::OnUpdateLine(CCmdUI *pCmdUI) { // TODO: 在此添加命令更新用户界面处理程序代码 pCmdUI->SetCheck(0); ...

qq_38706020的博客 816

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Qt绘图与图形视图之基本图元绘制的简单介绍

Qt绘图与图形视图之基本图元绘制的简单介绍

LF__plus的博客 1352

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

基于QGraphicsView、QGraphicsScene、自定义QGraphicsItem的小demo(正矩形、旋转矩形及圆形)

网上有很多关于这三个的资料,这方面的功能不做过多的描述,仅仅将在做小Demo过程中遇到的问题做下记录,下面是Demo的界面图: Demo的初衷是不想每次使用QGraphicsView和QGraphicsScene都重写,可以直接拿来使用,后来慢慢加了一些图形项,因为其实是为了熟悉QGpaphicsXX,所以目前只加了3种(正矩形,旋转矩形、圆),刚好这个Demo也练习了一种设计模式——工厂模式,现在就讲些步骤及遇到的问题(只贴关键的代码,整体代码看最后下载链接): 一、以鼠标为中心进行缩放 Q

Logan_Lin的博客 6775

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 傅里叶、拉普拉斯、Z变换、小波分析概述和应用
下一篇: 常用函数收集
armsnow
博客等级 码龄17年 28粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值