序言

QT用来做界面程序是真的方便,它本身封装了很多类库,需要的时候直接拿来用就行。
QT的类继承关系网上有很多相关的文章,这里不做赘述。但是简单的界面程序最主要的继承关系还是如下图:

可以将QT的类库分为两个大类,对象和事件。对象之间的信息传递为信号,执行操作的是槽函数。事件的发生则是人机交互的过程,比如鼠标点击、鼠标滚轮滑动、键盘按键等。

算了不多说了,直接上效果图:

太累了,直接上程序程序代码:

#ifndef DRAW_H
#define DRAW_H#include <QWidget>
#include "map.h"
#include "drawpixmap.h"
#include "coordtrans.h"
#include <QMouseEvent>
#include <QPushButton>class Draw : public QWidget
{Q_OBJECTpublic:Draw(Map& rMap);~Draw();// Member Funcitonsvoid mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void paintEvent(QPaintEvent *event);void wheelEvent(QWheelEvent *event);void setupUi(int iWidth, int iHeight);// Propertiesint _iAction;QPushButton* _pBtn1;QPushButton* _pBtn2;QPushButton* _pBtn3;QPushButton* _pBtn4;QWidget* _pWgt;QPixmap* _pPixmap;QPixmap* _pPixmap2;QPainter* _pPainter;QPoint _beginPos;QPoint _endPos;bool _bIsLefButtonDown;int _iXOffset,_iYOffset;int _iXAllOffset,_iYAllOffset;DrawPixmap _pDrawPixmap;Box* pBox;  // 用来调用Box类的成员函数CoordTrans _Transfer;Map* pMap;int _mousePos[4];QPoint _PointBegin;QPoint _PointEnd;public slots:void frameAmpliffication();void recover();void dragMove();void loadFile();};
#endif // DRAW_H

这是draw,h头文件,源文件代码如下:

#include "draw.h"
#include <QPainter>
#include <iostream>
#include <QBitmap>Draw::Draw(Map& rMap) :_pDrawPixmap(&rMap)
{setupUi(800,600);this->pMap = &rMap;_pPixmap = new QPixmap(this->width(), this->height()-30);_pPixmap->fill(Qt::white);_Transfer.Initialize(pMap->_dBox, this->width(), this->height()-30);_pPixmap2=new QPixmap(this->width(),this->height()-30);_pPixmap2->fill(Qt::transparent);_iXOffset=0,_iYOffset=0;_iXAllOffset=0;_iYAllOffset=0;_iAction=0;
}Draw::~Draw()
{}void Draw::paintEvent(QPaintEvent*)
{QPainter painter(this);if(_iAction==1){// 框选放大按钮点击_pDrawPixmap.update(&_Transfer, _pPixmap,0,0);painter.drawPixmap(0,30,this->width(),this->height()-30,*_pPixmap/*, -_iXAllOffset, -_iYAllOffset,this->width(),this->height()-30*/);painter.drawPixmap(0,30,this->width(),this->height()-30,*_pPixmap2);}else if(_iAction==0 || _iAction==2){// 初始状态或者恢复按钮点击_pDrawPixmap.update(&_Transfer, _pPixmap,0,0);painter.drawPixmap(0,30,this->width(),this->height()-30,*_pPixmap/*, -_iXAllOffset, -_iYAllOffset,this->width(),this->height()-30*/);}if(_iAction==3){// 拖拽移动按钮点击_pPixmap->fill(Qt::white);_pDrawPixmap.update(&_Transfer, _pPixmap,_iXAllOffset,_iYAllOffset);painter.drawPixmap(0,30,*_pPixmap );}
}void Draw::mousePressEvent(QMouseEvent* event)
{_beginPos.setX(event->x());_beginPos.setY(event->y()-30);_mousePos[0] = event->x();_mousePos[1] = event->y()-30;_bIsLefButtonDown=true;if(_iAction==1){    }else if(_iAction==2){    }else if(_iAction==3){_iXAllOffset+=_iXOffset;_iYAllOffset+=_iYOffset;}
}void Draw::mouseMoveEvent(QMouseEvent *event)
{_endPos.setX(event->pos().x());_endPos.setY(event->pos().y()-30);if(_bIsLefButtonDown){if(_iAction==1){QPainter painter2(_pPixmap2);_pPixmap2->fill(Qt::transparent);painter2.drawRect(QRect(_beginPos,_endPos));update();}if(_iAction==3){int tempx=_iXOffset;int tempy=_iYOffset;_iXOffset = _endPos.x()-_beginPos.x();_iYOffset = _endPos.y()-_beginPos.y();_iXAllOffset += (_iXOffset-tempx);_iYAllOffset += (_iYOffset-tempy);update();}}
}void Draw::mouseReleaseEvent(QMouseEvent* event)
{if(_iAction==1){if(event->button() == Qt::LeftButton){_bIsLefButtonDown=false;_mousePos[2] = event->x();_mousePos[3] = event->y()-30;double dxb,dyb,dxe,dye;_Transfer.C2M(_mousePos[0],_mousePos[1],dxb,dyb);_Transfer.C2M(_mousePos[2],_mousePos[3],dxe,dye);double ChosenArea[4]={dxb,dyb,dxe,dye};_Transfer.Initialize(ChosenArea,this->width(),this->height()-30);_pPixmap->fill(Qt::white);_pPixmap2->fill(Qt::transparent);update();}}else if(_iAction==2){}else if(_iAction==3){    }else if(_iAction==4){}
}void Draw::wheelEvent(QWheelEvent *event)
{if(event->delta()>0){}
}void Draw::setupUi(int iWidth, int iHeight)
{this->setWindowTitle("MyAPP");this->resize(iWidth,iHeight);_pBtn1=new QPushButton("框选放大",this);_pBtn1->setGeometry(0,0,80,30);connect(_pBtn1,SIGNAL(clicked()),this,SLOT(frameAmpliffication()));_pBtn2=new QPushButton("恢复",this);_pBtn2->setGeometry(85,0,80,30);connect(_pBtn2,SIGNAL(clicked()),this,SLOT(recover()));_pBtn3=new QPushButton("拖拽移动",this);_pBtn3->setGeometry(170,0,80,30);connect(_pBtn3,SIGNAL(clicked()),this,SLOT(dragMove()));_pBtn4=new QPushButton("加载文件",this);_pBtn4->setGeometry(255,0,80,30);connect(_pBtn4,SIGNAL(clicked()),this,SLOT(loadFile()));
}void Draw:: frameAmpliffication()
{this->setCursor(Qt::ArrowCursor);_iAction=1;
}
void Draw:: recover()
{_iAction=2;this->setCursor(Qt::ArrowCursor);_pPixmap->fill(Qt::white);_Transfer.Initialize(pMap->_dBox,this->width(),this->height()-30);update();
}
void Draw:: dragMove()
{_iAction=3;if(this->cursor().pos().y()>30)this->setCursor(Qt::OpenHandCursor);
}
void Draw:: loadFile()
{_iAction=4;
}

有不懂的留言,我时常来逛。太累了,睡觉了。

QT实现图片的滚轮缩放、框选放大、拖拽移动相关推荐

  1. 基于华为云自定义模板的图片操作演示(框选、拖拽)

    掘金链接 华为云自定义模板识别是服务于AI领域的流程控制系统,我们一起了解下其中一个模块的界面化操作实例.如下图,针对图片的高精度识别,我们需要处理图片的样式以便获得更好的模型训练数据和高精度识别结果 ...

  2. 微信小程序怎么实现 图片按住一角缩放、旋转、拖拽

    微信小程序怎么实现 图片按住一角缩放.旋转.拖拽 图片一角可以加个小图片,按住来操作 利用movable-view.movable-area 可以实现拖拽缩放.不好旋转 是不是可以利用canvas绘图 ...

  3. QCustomPlot系列 进行框选放大(二)

    前面一章已经记录了 怎么进行框选放大了. 添加如下代码: customPlot->selectionRect()->setPen(QPen(Qt::black,1,Qt::DashLine ...

  4. QCustomPlot使用心得六:框选放大,拖动,选中数据

    一.先看效果图 框取数据后,还可以按Ctrl追加数据点 二.原理 qcustomPlot是有鼠标选择框功能的,只是默认是不使能,所以平常拖动鼠标没有反应,调用setSelectionRectMode可 ...

  5. 用开源项目PhotoView实现图片的双指缩放和双击放大缩小

    项目地址:https://github.com/chrisbanes/PhotoView 用开源项目有个好处,一是实现简单,二是bug少.那么我们就来说下这个项目能够实现的效果: 1.单个图片的双指缩 ...

  6. iOS开发——仿微信图片浏览交互的实现(向下拖拽图片退出图片浏览器)

    点击上方"iOS开发",选择"置顶公众号" 关键时刻,第一时间送达! DEMO的github地址:https://github.com/YYProgrammer ...

  7. 长按识别图片变大,且可进行拖拽导致无法长按识别二维码

    项目场景: 苹果系统在H5长按识别二维码 问题描述: 长按识别图片变大,且可进行拖拽导致无法长按识别二维码. 同类问题:微信公众号二维码长按识别时,不是识别,而是放大 解决方案: 加一个图片禁止拖拽脚 ...

  8. vue 图片复制黏贴上传_# quill-image-extend-module :完成vue-quill-editor图片上传,复制粘贴,拖拽...

    vue-quill-editor的加强模块, 功用: 供应图片上传到服务器的功用 复制插进去 拖拽插进去 显现上传进度 显现上传胜利或许失利 支撑与其他模块一同运用(比方调解图片大小) Install ...

  9. vue拖动添加模块展示_vue-quill-editor的增强模块,提供图片上传,复制插入,拖拽插入...

    sorry everyone, 由于作者自身原因,没有精力和时间处理issues,该插件已经不做维护了,希望大家见谅. quill-image-extend-module vue-quill-edit ...

最新文章

  1. 2D图像转3D仅需5秒,特斯拉的自动驾驶技术有救了?
  2. 针对故障场景的血液,汗液和书写自动集成测试
  3. java子类怎么编译_java – 无法编译从基类实现抽象方法的子类
  4. python按键盘上哪个键运行_python按什么键运行
  5. vue keep-alive
  6. “鱼渔合作”在IT运维中的启示
  7. python开发app1001无标题_Python代写:CSSE1001 Dots Co帮做Python编程作业
  8. Hadoop集群部署模型纵览3
  9. Oracle 安装报错 [INS-06101] IP address of localhost...
  10. Oracle数据备份与恢复
  11. 读到良葛格的反思Hello World
  12. IM即时通讯源码 聊天交友APP源码
  13. Backtrader(十一) - Indicator指标
  14. linux----------2--3----(无名)管道通信原理及管道编程实战
  15. SCI期刊Cover Letter写法模板
  16. QT学习-----按钮弹起效果的实现
  17. 信息时代的独立阅读者(二):怎么阅读科普类文章
  18. OFO单车天价回购ofo.com,so域名后缀地位不保!
  19. 《软件方法(上)业务建模和需求》第2版 勘误(2021年9月更新)
  20. TMSI 重配置流程

热门文章

  1. python 数列筛选_numpy ndarray 按条件筛选数组,关联筛选的例子
  2. 华为 日志服务器 配置文件,华为设置日志服务器配置
  3. 甘超波:NLP自我价值感
  4. cocos2dx-setUserData
  5. 昆石VOS2009 VOS3000无漏洞去后门电脑管理客户端大全
  6. 美团饿了么外卖返利小程序公众号搭建外卖返利分销系统代cps源码
  7. 计算机休眠后无法唤醒出现蓝屏,电脑休眠后无法唤醒怎么办【解决方法】
  8. 简述PHP是什么?PHP文件是什么?
  9. 【使用QGIS入库将shp数据导入postgis、postgres数据库】
  10. 计算机二级office考试题库操作题,计算机二级考试MSOffice考试题库ppt操作题附答案...