橡皮筋类 QRubberBand
最近在利用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相关推荐
- qt中橡皮筋类 QRubberBand
在图形编辑应用中常会用到橡皮筋线,如选择图形的某个区域等,最常见的就是在系统桌面上用鼠标拖动,可以绘制一个类似蚂蚁线的选区,并且选区线能够跟随鼠标的移动而伸缩,因此叫作橡皮筋线. qt 中用于描绘橡皮 ...
- CRectTracker(橡皮筋)类的使用
CRectTracker(俗称"橡皮筋"类)是一个非常有意思的类.你在Windows中,在桌面上用鼠标拖拽,便可以看到一个虚线的矩形框,它便是橡皮筋.它可以用做显示边界,你也可以扽 ...
- 橡皮筋类CRectTracker
橡皮筋类(CRectTracker) Windows自带的画图软件中可以用虚线框选择图像的某个区域,之后便可以拖动.放大.缩小该区域,这是通过橡皮筋类(CRectTracker)来实现的,它将实现用线 ...
- 橡皮筋类(CRectTracker)
Windows自带的画图软件中可以用虚线框选择图像的某个区域,之后便可以拖动.放大.缩小该区域,这是通过橡皮筋类(CRectTracker)来实现的,它将实现用线框选中一个区域,并可以拖动.放大.缩小 ...
- QT 类及其实现效果(8)--橡皮筋线,Graphics view
一.选择图形的某个区域,绘制一个类似蚂蚁线的选区.使用类QRubberBand if (!rubberBand) rubberBand = new QRubberBand(QRubberB ...
- QStyle类用法总结(三)
1.前言 为了更容易搞懂Qt自定义风格绘制,在平时开发中,实现定制自己风格的UI,本人推出有关QStyle自定义风格系列文章.说明如下: <QStyle类用法总结(一)>.该文是对Qt自定 ...
- CRectTracker类的使用
原文链接地址:http://www.vckbase.com/index.php/wv/133 CRectTracker(俗称"橡皮筋"类)是一个非常有意思的类.你在Windows中 ...
- Qt组件中的双缓冲无闪烁绘图
双缓冲绘图 在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOnS ...
- Qt渲染视频常见问题(视频渲染窗口上子窗口设置透明出现阴影问题、主窗口缩放导致视频渲染窗口部分出现视频闪烁问题)
开发环境 Qt5.9.6+VS2015 1.视频渲染窗口上子窗口设置透明出现阴影问题 平时为了方便代码管理,一般窗口上设置窗口或者控件,都会设置Parent(setParent),这样对主窗口进行某种 ...
最新文章
- 调驱动 一定注意 cache 表的
- Solaris 10主动安顿DVD运用步骤
- Oracle的Endgame,或被Amazon收购或自生自灭?
- Visual C++线程同步技术
- 什么是微型计算机的组成原理,1微型计算机基本组成原理.ppt
- 源码之前,了无秘密(一)——iterator adapter
- visa虚拟卡生成器_虚拟信用卡,怎么用才能满足多元化消费呢?这样的账单才算优质...
- 值得收藏!9个最佳SSD状态监控及性能优化工具
- Win10+Ubuntu+Deepin+macOS+PhoenixOS+FydeOS+centOS+openSUSE+Kylin+ChromeOS+RedFlag等多系统安装(包含rEFind引导)
- typedef void far *LPVOID 的具体定义
- 阻止YouTube视频在Chrome中自动播放
- allure企业级定制报告
- 项目管理经验-豆知识
- HTML设置圆角头像,圆角头像的制作
- 计算机专业秃顶图片,大学被叫惨的三大专业,计算机秃顶是常事,医学专业这个就惨了!...
- 再见了青春,联想Y450最后一次升级,真的神一般存在。
- java 实验4 字体对话框_文字字体设计窗体 实验!求大神
- 来自北京大学NOIP金牌选手yxc的常用代码模板3——搜索与图论
- 用html写除法竖式代码,除法的竖式写法
- 3.神经网络-深度学习入门
热门文章
- python初级8(buffering:缓冲区,encoding,文本操作,写入,文件指针,with关键字,调试 debug)
- python机器人编程教程入门_机器人操作系统(ROS)入门必备:机器人编程一学就会
- python多个领域140个常用库 (标准库/第三方库)
- iPhone建立热点-通过USB连接
- OSChina 周二乱弹 —— 记一次难忘的通勤经历
- 两个PDF比较标出差异_轻松搞定PDF格式转换
- 通用格式HDMap --- 测绘学报50卷--通用化高精地图数据模型
- 字母查找python
- redis实现分布式锁的原理
- 如何解决javac不是内部或外部命令,也不是可运行程序的问题.