最近在利用Qt的QRubberBand类绘制矩形框。QRubberBand可以实现橡皮筋框选取,即便是QRubberBand::Line,但是QRubberBand类只能绘制水平或垂直的线,不能绘制360度任意角度的线。

在图形编辑应用中常会用到橡皮筋线,如选择图形的某个区域等,最常见的就是在系统桌面上用鼠标拖动,可以绘制一个类似蚂蚁线的选区,并且选区线能够跟随鼠标的移动而伸缩,因此叫作橡皮筋线。
qt 中用于描绘橡皮筋线的类是QRubberBand,当然单有一个QRubberBand 类还是不能做出橡皮筋的效果出来, 另外还要有鼠标事件的配合,与QRubberBand 配合的鼠标事件有 鼠标单击,拖动及释放。
创建一个QRubberBand 类,new QRubberBand(QRubberBand::Line,this)
QRubberBand::Rectangle 是设置橡皮筋线的类型,这种线的效果是描绘了一个方形的区域,还有** QRubberBand::Line** ,则为一个被直线填满的方形区域,相当于一个阴影的方形区域。
QRubberBand 应用最多的函数是 setGeometry(),其作用是设置了橡皮筋线的位置及大小。
自己定义一个橡皮筋的类Rubber 如下所示:
新建一个Qt空项目rubber.pro

qt += gui coreSOURCES += \main.cpp \rubber.cppHEADERS += \rubber.h

main.cpp

#include <QtGui/QApplication>#include "rubber.h"int main(int argc,char**argv)
{QApplication a(argc,argv);Rubber rubber;rubber.show();return a.exec();
}

rubber.h

#ifndef RUBBER_H
#define RUBBER_H#include <QWidget>
#include <QRubberBand>
#include <QMouseEvent>class Rubber : public QWidget
{Q_OBJECT
public:explicit Rubber(QWidget *parent = 0);void mousePressEvent(QMouseEvent *);void mouseMoveEvent(QMouseEvent *);void mouseReleaseEvent(QMouseEvent *);private:QRubberBand *rubberBand;QPoint origin;};#endif // RUBBER_H

rubber.cpp

#include "rubber.h"Rubber::Rubber(QWidget *parent) :QWidget(parent)
{setParent(parent);this->setBackgroundRole(QPalette::Light);this->setAutoFillBackground(true);resize(400,360);setWindowTitle("Rubber");rubberBand = NULL;
}
//构造函数完成了对窗体尺寸及背景的设置。//鼠标在窗体中按下时,创建一个QRubberBand 类,QRubberBand::Rectangle 是设置橡皮筋线的类型,
//这种线的效果是描绘了一个方形的区域,还有一种是QRubberBand::Line,则为一个被直线填满的方形区域,
//相当于一个阴影的方形区域。QRubberBand 应用最多的函数是 setGeometry(),其作用是设置了橡皮筋线的位置及大小。
void Rubber::mousePressEvent(QMouseEvent *e)
{origin = e->pos();if(!rubberBand)rubberBand = new QRubberBand(QRubberBand::Line,this);rubberBand->setGeometry(QRect(origin,QSize()));rubberBand->show();
}//在鼠标按下,并且鼠标发生移动的时候,这时就可以会出橡皮线的区域,
//鼠标拖动事件函数重载如下 改区域的大小由QRect(origin,e->pos()).normalized()) 来体现,
//其中normalized() 函数返回的也是一个QRect的对象,不过该对象的长和宽的值都是大于零时值
void Rubber::mouseMoveEvent(QMouseEvent *e)
{if(rubberBand)rubberBand->setGeometry(QRect(origin,e->pos()).normalized());
}//当鼠标松开时,橡皮筋线就可以隐藏了
void Rubber::mouseReleaseEvent(QMouseEvent *e)
{if(rubberBand)rubberBand->hide();
}
#include "rubber.h"Rubber::Rubber(QWidget *parent) :QWidget(parent)
{setParent(parent);this->setBackgroundRole(QPalette::Light);this->setAutoFillBackground(true);resize(400,360);setWindowTitle("Rubber");rubberBand = NULL;
}
//构造函数完成了对窗体尺寸及背景的设置。//鼠标在窗体中按下时,创建一个QRubberBand 类,QRubberBand::Rectangle 是设置橡皮筋线的类型,
//这种线的效果是描绘了一个方形的区域,还有一种是QRubberBand::Line,则为一个被直线填满的方形区域,
//相当于一个阴影的方形区域。QRubberBand 应用最多的函数是 setGeometry(),其作用是设置了橡皮筋线的位置及大小。
void Rubber::mousePressEvent(QMouseEvent *e)
{origin = e->pos();if(!rubberBand)rubberBand = new QRubberBand(QRubberBand::Line,this);rubberBand->setGeometry(QRect(origin,QSize()));rubberBand->show();
}//在鼠标按下,并且鼠标发生移动的时候,这时就可以会出橡皮线的区域,
//鼠标拖动事件函数重载如下 改区域的大小由QRect(origin,e->pos()).normalized()) 来体现,
//其中normalized() 函数返回的也是一个QRect的对象,不过该对象的长和宽的值都是大于零时值
void Rubber::mouseMoveEvent(QMouseEvent *e)
{if(rubberBand)rubberBand->setGeometry(QRect(origin,e->pos()).normalized());
}//当鼠标松开时,橡皮筋线就可以隐藏了
void Rubber::mouseReleaseEvent(QMouseEvent *e)
{if(rubberBand)rubberBand->hide();
}

Line.png

Rectangle.png

橡皮筋类 QRubberBand相关推荐

  1. qt中橡皮筋类 QRubberBand

    在图形编辑应用中常会用到橡皮筋线,如选择图形的某个区域等,最常见的就是在系统桌面上用鼠标拖动,可以绘制一个类似蚂蚁线的选区,并且选区线能够跟随鼠标的移动而伸缩,因此叫作橡皮筋线. qt 中用于描绘橡皮 ...

  2. CRectTracker(橡皮筋)类的使用

    CRectTracker(俗称"橡皮筋"类)是一个非常有意思的类.你在Windows中,在桌面上用鼠标拖拽,便可以看到一个虚线的矩形框,它便是橡皮筋.它可以用做显示边界,你也可以扽 ...

  3. 橡皮筋类CRectTracker

    橡皮筋类(CRectTracker) Windows自带的画图软件中可以用虚线框选择图像的某个区域,之后便可以拖动.放大.缩小该区域,这是通过橡皮筋类(CRectTracker)来实现的,它将实现用线 ...

  4. 橡皮筋类(CRectTracker)

    Windows自带的画图软件中可以用虚线框选择图像的某个区域,之后便可以拖动.放大.缩小该区域,这是通过橡皮筋类(CRectTracker)来实现的,它将实现用线框选中一个区域,并可以拖动.放大.缩小 ...

  5. QT 类及其实现效果(8)--橡皮筋线,Graphics view

    一.选择图形的某个区域,绘制一个类似蚂蚁线的选区.使用类QRubberBand  if (!rubberBand)      rubberBand = new QRubberBand(QRubberB ...

  6. QStyle类用法总结(三)

    1.前言 为了更容易搞懂Qt自定义风格绘制,在平时开发中,实现定制自己风格的UI,本人推出有关QStyle自定义风格系列文章.说明如下: <QStyle类用法总结(一)>.该文是对Qt自定 ...

  7. CRectTracker类的使用

    原文链接地址:http://www.vckbase.com/index.php/wv/133 CRectTracker(俗称"橡皮筋"类)是一个非常有意思的类.你在Windows中 ...

  8. Qt组件中的双缓冲无闪烁绘图

    双缓冲绘图 在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOnS ...

  9. Qt渲染视频常见问题(视频渲染窗口上子窗口设置透明出现阴影问题、主窗口缩放导致视频渲染窗口部分出现视频闪烁问题)

    开发环境 Qt5.9.6+VS2015 1.视频渲染窗口上子窗口设置透明出现阴影问题 平时为了方便代码管理,一般窗口上设置窗口或者控件,都会设置Parent(setParent),这样对主窗口进行某种 ...

最新文章

  1. 调驱动 一定注意 cache 表的
  2. Solaris 10主动安顿DVD运用步骤
  3. Oracle的Endgame,或被Amazon收购或自生自灭?
  4. Visual C++线程同步技术
  5. 什么是微型计算机的组成原理,1微型计算机基本组成原理.ppt
  6. 源码之前,了无秘密(一)——iterator adapter
  7. visa虚拟卡生成器_虚拟信用卡,怎么用才能满足多元化消费呢?这样的账单才算优质...
  8. 值得收藏!9个最佳SSD状态监控及性能优化工具
  9. Win10+Ubuntu+Deepin+macOS+PhoenixOS+FydeOS+centOS+openSUSE+Kylin+ChromeOS+RedFlag等多系统安装(包含rEFind引导)
  10. typedef void far *LPVOID 的具体定义
  11. 阻止YouTube视频在Chrome中自动播放
  12. allure企业级定制报告
  13. 项目管理经验-豆知识
  14. HTML设置圆角头像,圆角头像的制作
  15. 计算机专业秃顶图片,大学被叫惨的三大专业,计算机秃顶是常事,医学专业这个就惨了!...
  16. 再见了青春,联想Y450最后一次升级,真的神一般存在。
  17. java 实验4 字体对话框_文字字体设计窗体 实验!求大神
  18. 来自北京大学NOIP金牌选手yxc的常用代码模板3——搜索与图论
  19. 用html写除法竖式代码,除法的竖式写法
  20. 3.神经网络-深度学习入门

热门文章

  1. python初级8(buffering:缓冲区,encoding,文本操作,写入,文件指针,with关键字,调试 debug)
  2. python机器人编程教程入门_机器人操作系统(ROS)入门必备:机器人编程一学就会
  3. python多个领域140个常用库 (标准库/第三方库)
  4. iPhone建立热点-通过USB连接
  5. OSChina 周二乱弹 —— 记一次难忘的通勤经历
  6. 两个PDF比较标出差异_轻松搞定PDF格式转换
  7. 通用格式HDMap --- 测绘学报50卷--通用化高精地图数据模型
  8. 字母查找python
  9. redis实现分布式锁的原理
  10. 如何解决javac不是内部或外部命令,也不是可运行程序的问题.