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

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

connect(view->verticalScrollBar(),&QScrollBar::valueChanged,this,&chunzhongForm::slot_VvalueChanged);
connect(view->horizontalScrollBar(),&QScrollBar::valueChanged,this,&chunzhongForm::slot_HvalueChanged);void chunzhongForm::slot_VvalueChanged(int value)
{if(value != 0 && dlg != NULL){m_y = value;if(dlg->isVisible()){emit signalSetDrawRectSize();}}
}void chunzhongForm::slot_HvalueChanged(int value)
{if(value != 0 && dlg != NULL){m_x = value;if(dlg->isVisible()){emit signalSetDrawRectSize();}}
}connect(this,&chunzhongForm::signalSetDrawRectSize,this,&chunzhongForm::slot_setViewRect);QSize GraphicsView::viewportSizeHint()
{return viewport()->size();
}void chunzhongForm::slot_setViewRect()
{m_viewSize = view->viewportSizeHint();//获取视口大小int x = m_x / (m_viewSize.width() * m_scale)* SMALL_W;int y = m_y / (m_viewSize.height() * m_scale)* SMALL_H;int wid = SMALL_W / m_scale;int hei = SMALL_H / m_scale;outPut<<"小矩形坐标及大小:"<<"("<<m_x<<" ,"<<m_y<<" ,"<<wid<<" ,"<<hei<<")";//换成qDebug()输出QRect rect(x,y,wid,hei);emit signalDrawRect(rect);
}
connect(this,&chunzhongForm::signalDrawRect,dlg,&BreviaryDlg::slot_setRectSize);//缩略图窗口类BreviaryDlg
void BreviaryDlg::slot_setRectSize(QRect &rect)
{m_rect = rect;scene->onSetPreviewRect(rect);
}//缩略图中的自定义场景
void MyGraphicsScene::onSetPreviewRect(QRect rect)
{m_rectSaved = rect;// 内缩几个像素,用矩形外边框来标示viewport显示区域m_pRectItem->setRect(rect.x() - 2/*+ 5*/, rect.y() - 2/*+ 5*/, rect.width() - 4, rect.height() - 4);//设置图形项矩形
}

下面贴出自定义场景类
MyGraphicsScene.h

#pragma once//#include <vld.h>
#include <QGraphicsScene>class MyGraphicsScene : public QGraphicsScene
{Q_OBJECTpublic:MyGraphicsScene(QObject *parent = nullptr);virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent);Q_SIGNALS:void previewRectMoved(QRect rect);public Q_SLOTS:void onSetPreviewRect(QRect rect);private:QGraphicsRectItem* m_pRectItem;QRect m_rectSaved;bool m_bRectClicked;QPoint m_ptRectRelated;     // 鼠标点击时,相对于红色矩形框的位置
};

MyGraphicsScene.cpp

#include "MyGraphicsScene.h"
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsRectItem>
#include <QDebug>MyGraphicsScene::MyGraphicsScene(QObject *parent): QGraphicsScene(parent), m_bRectClicked(false)
{m_pRectItem = new QGraphicsRectItem(0, 0, 0, 0);QPen penRectItem = QPen(QColor(255, 0, 0));penRectItem.setWidth(2);m_pRectItem->setPen(penRectItem);m_pRectItem->setZValue(1);addItem(m_pRectItem);
}void MyGraphicsScene::onSetPreviewRect(QRect rect)
{m_rectSaved = rect;// 内缩几个像素,用矩形外边框来标示viewport显示区域m_pRectItem->setRect(rect.x() - 2/*+ 5*/, rect.y() - 2/*+ 5*/, rect.width() - 4, rect.height() - 4);
}void MyGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{QGraphicsScene::mouseMoveEvent(mouseEvent);if (m_bRectClicked) {QPoint ptTopLeft = mouseEvent->scenePos().toPoint() - m_ptRectRelated;m_rectSaved.setTopLeft(ptTopLeft);
//        qDebug()<<"mouseMoveEvent";emit previewRectMoved(m_rectSaved);}
}void MyGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{QGraphicsScene::mousePressEvent(mouseEvent);if (m_rectSaved.contains(mouseEvent->scenePos().x(), mouseEvent->scenePos().y())) {m_bRectClicked = true;m_ptRectRelated = mouseEvent->scenePos().toPoint() - m_rectSaved.topLeft();}
}void MyGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{QGraphicsScene::mouseReleaseEvent(mouseEvent);m_bRectClicked = false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL ES EGL eglChooseConfig

目录 一. EGL 前言二. EGL 绘制流程简介三.eglGetConfigs 函数简介 四.eglGetConfigs 函数使用五.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基…

第九篇:Spring Boot整合Spring Data JPA_入门试炼03

CrudRepository接口的使用 CrudRepository接口&#xff0c;主要完成一些增删改查的操作。 注意&#xff1a;CrudRepository接口继承Repository接口 1、持久层接口&#xff1a; package com.gblfy.repository;import com.gblfy.pojo.Users; import org.springframework.data.r…

第九篇:Spring Boot整合Spring Data JPA_入门试炼04

六、PagingAndSortingRepository接口 前言&#xff1a;该接口提供了分页与排序的操作&#xff0c;该接口继承了CrudRepository 1、持久层接口&#xff1a; public interface UserRepositoryPagingAndSorting extends PagingAndSortingRepository<Users,Integer> { }测试…

qt创建图形项,添加自定义窗口

创建场景&#xff0c;视图和图形项之后&#xff0c;在图形项中添加自定义窗口。主要代码如下&#xff1a; scene new QGraphicsScene(0,0,1855,578,ui->insideWidget);//在开发中QGraphicsScene::sceneRect最好小于等于QGraphicsView::sceneRect大小&#xff0c;以保证在缩…

成立一周?谷歌人工智能道德委员会解散了?近日,金山云和小米刚签订了不超过9000万的硬件产品供应协议,闹哪样? | 极客头条...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 亚马逊推Alexa无线耳机&…

java.sql.SQLException: validateConnection false

解决方案&#xff1a; 将mysql-connector-java版本修改为下面版本&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.0.2</version> </dependency>

第九篇:Spring Boot整合Spring Data JPA_入门试炼05

JpaRepository接口 前言&#xff1a;该接口继承了PagingAndSortingRepository接口。对继承的父接口中方法的返回值进行适配。 例如&#xff1a;父接口中的方法的返回值是是迭代器&#xff0c;而在子类(JpaRepository)返回值是Lis集合。 1、持久层接口&#xff1a; public inte…

2019年技术盘点微服务篇(二):青云直上云霄 | 程序员硬核评测

戳蓝字“CSDN云计算”关注我们哦&#xff01;程序员硬核评测&#xff1a;客观、高效、不说软话。无论是技术质量、性能水平&#xff0c;还是工具筛选&#xff0c;一测便知&#xff01;作者&#xff1a;孙浩峰过去几年来&#xff0c;“微服务架构”方兴未艾&#xff0c;尽管这种…

第九篇:Spring Boot整合Spring Data JPA_入门试炼06

八、JpaSpecificationExecutor接口 前言&#xff1a;该接口主要提供了多条件查询的支持&#xff0c;并且可以在查询中添加分页和排序。 注意&#xff1a;JpaSpecificationExecutor接口是独立存在的。完全独立。 1、持久层接口&#xff1a; public interface UsersRepositoryS…

Qt场景中图形项的删除

场景中图形项删除的时候调用系统函数removeItem()删除该图形项&#xff0c;但还需将图形项delete掉&#xff0c;并置为空&#xff0c;主要代码如下&#xff1a; void chunzhongForm::deleteItem(QGraphicsItem *item) {scene->removeItem(item);if(item ! NULL){delete ite…

第十篇:Spring Boot整合mybatis+逆向工程(Mysql+Oracle) 入门试炼01

1、添加pom依赖 <dependencies><!--springboot web 启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--thymeleaf 启动器--><d…

Qt中QMap删除元素的简单使用

QMap基本上qt中的使用和C中QMap的使用一样&#xff0c;下面先附上一段代码&#xff1a; void chunzhongForm::deleteScrGroupItem(int screenGroup) {QMap<findInfo,QGraphicsRectItem*>::iterator it;for(it itemMap.begin();it!itemMap.end();){if(it.key().sid scr…

Docker简介与简单使用 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;常仕禄转自&#xff1a;Docker前一段花了一段时间研究Log4j2的源码&a…

OpenGL ES EGL eglSwapBuffer

目录 一. EGL 前言二. EGL 绘制流程简介三.eglSwapBuffer 函数简介 四.关于多个 EGLContext五.共享 EGLContext六.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> Open…

第十篇:Spring Boot整合mybatis+Mysql 入门试炼02

前言&#xff1a; 1、(SprigBoot整合SpringMVCMybatis) 2、以thymeleaf作为视图层技术整合 3、springboot版本2.0.5.RELEASE 创建项目 1、添加依赖及启动器 <dependencies><!--springboot web 启动器--><dependency><groupId>org.springframework.boo…

qt获取场景的缩略图

获取场景缩略图的代码如下&#xff1a; void chunzhongForm::getRenderPaint() {QPixmap pixmap(SMALL_W,SMALL_H);pixmap.fill(Qt::transparent);QPainter painter(&pixmap);painter.setRenderHint(QPainter::Antialiasing);scene->render(&painter);pixmap.save(…

要闻君说:台积电将为iPhone生产5纳米A系列芯片?腾讯云TStack与银河麒麟完成互认证……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 【4月9日 星期二】云の声音切…

Centos出现-bash: unzip: command not found的解决办法

利用unzip命令解压缩的时候&#xff0c;出现-bash: unzip: command not found的错误 问题定位&#xff1a; unzip——命令没有找到&#xff0c;其原因肯定是没有安装unzip。 解决方案在线安装unzip &#xff1a; 执行命令&#xff1a; yum install -y unzip zip安装成功后就可…

一堆数据中将某一个值相同的数据进行分组

假如一堆数据&#xff0c;每一个数据都有一个标志位&#xff0c;按照标志位值的不同进行划分为不同的组&#xff0c;进行归类。 代码如下&#xff1a; void chunzhongForm::traverseList(winProList &dataList) {int nSize dataList.size();for(int i 0; i < nSize; …

微服务进阶避坑指南 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;来源&#xff1a;青云QingCloud 作者&#xff1a;周小四 青云QingCloud 应用及容器平台…