QT学习笔记(三)——vs2019+Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放

这篇具有很好参考价值的文章主要介绍了QT学习笔记(三)——vs2019+Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vs2019+Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放

之前写了一个博客讲怎么显示一张影像,那个是基于Qpainter的
今天使用QLabel来显示影像,并且用鼠标滚轮控制缩放。
关于图像的打开和显示,主要参考这个博客
关于如何使图片自适应窗口与铺满窗口,可以参考这个博客。
这两个博客出自同一作者,都很详细。
其中按照第二个博客运行后存在的问题是,点了铺满窗口后,再点自适应窗口,图片没有反应。
解决方法:
1.在头文件添加成员变量

    QImage m_image;

2.在InitImage()函数和File_open()两个中将img拷贝到m_image中,即在这两个函数中都添加:

    m_image = img->copy();

3.在fullSize()和autoSize()两个函数中最前面添加

imgLabel->setPixmap(QPixmap::fromImage(m_image));
imgLabel->resize(m_image.width(), m_image.height());

这样每次点击这俩按钮的时候,label的大小都会回到原影像的大小。

接着这个博客,下面主要讲一下如何用鼠标滚轮控制图片缩放。

1.此时打开较大的影像,鼠标滚轮是控制图片上下移动的。因此首先重写 QAbstractScrollArea 类的wheelEvent函数,让它什么都不要做

void QAbstractScrollArea::wheelEvent(QWheelEvent* event)
{
    return;
}

2.然后实现滚轮控制label放大缩小

void tstQt::wheelEvent(QWheelEvent* event)
{
    double ratio = (double)m_image.height() / (double)m_image.width();//图像的比例
    QPoint numDegrees;                                     // 定义指针类型参数numDegrees用于获取滚轮转角
    numDegrees = event->angleDelta();                      // 获取滚轮转角
    int step = 0;                                          // 设置中间参数step用于将获取的数值转换成整数型
    if (!numDegrees.isNull())                              // 判断滚轮是否转动
    {
        step = numDegrees.y();                             // 将滚轮转动数值传给中间参数step
    }
    event->accept();                                       // 获取事件
    int currentWidth = imgLabel->width();                  // 获取当前图像的宽
    int currentHeight = imgLabel->height();               // 获取当前图像的高
    currentWidth += step;                                  // 对当前图像的高累加
    currentHeight += (int)(step*ratio);                                 // 对当前图像的宽累加
    if (step > 0)                                          // 判断图像是放大还是缩小
    {
        QString imgsize = QString("图像放大,尺寸为:%1 * %2")
            .arg(currentWidth).arg(currentHeight);
        qDebug() << imgsize;                               // 打印放大后的图像尺寸
    }
    else
    {
        QString imgsize = QString("图像缩小,尺寸为:%1 * %2")
            .arg(currentWidth).arg(currentHeight);
        qDebug() << imgsize;                                // 打印缩小后的图像尺寸
    }
    imgLabel->resize(currentWidth, currentHeight);          // 通过更新图像显示控件的大小来更新图像大小
}

这里设置了一个图像比例因子ratio,可以使图像缩放过程中,比例不要失调。
但是如果先点击了铺满窗口在进行缩放,那label的大小就会变成窗口大小,图像比例就会失调。

但是这时候会发现缩放是以label的左上角为原点进行缩放的,但常用的是以鼠标为中心进行缩放,所以下面实现此部分

1.首先在wheelEvent函数最前面添加代码

	int dockWin_pos = scrollArea->geometry().y()+dock_Image->geometry().y();
    QScrollBar* tmph = scrollArea->horizontalScrollBar();
    QScrollBar* tmpv = scrollArea->verticalScrollBar();
    QPoint pos = event->pos();//得到当前鼠标在窗口的位置
    QRect tmplab = imgLabel->geometry();//获得imglabel的位置
    int th = pos.x() - tmplab.x();   // 缩放前鼠标点在label中的坐标
    int tv = pos.y() - tmplab.y() - dockWin_pos;

这里需要注意的是鼠标位置pos的坐标,它的坐标原点并不是显示图像的区域的左上角,而是。。。不说了,看图
QT学习笔记(三)——vs2019+Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放
所以我自己量了一下图中两个坐标原点的y轴相差大约79,在上面代码中用dockWin_pos来表示。因为这个坐标原点一开始我没整明白,导致我浪费了一天时间找bug…
2.计算label的放缩比例,因为前面代码是直接加减了一个step,现在计算一下放缩比例就是step/currentwidth
这一句要加在currentWidth变化前。

 double r = (double)(step) / (double)(currentWidth);  //   放缩比例

3.计算滚轮变化量

    int move_x = r * th;
    int move_y = r * tv;
    
    tmph->setValue(tmph->value()+ move_x);
    tmpv->setValue(tmpv->value() + move_y)

关于整个的原理,得自己画图理解一下了文章来源地址https://www.toymoban.com/news/detail-494715.html

最后放一下完整的weelEvent()函数代码:

void tstQt::wheelEvent(QWheelEvent* event)
{
	int dockWin_pos = scrollArea->geometry().y()+dock_Image->geometry().y();
	
    QScrollBar* tmph = scrollArea->horizontalScrollBar();
    QScrollBar* tmpv = scrollArea->verticalScrollBar();
    QPoint pos = event->pos();//得到当前鼠标在窗口的位置
    QRect tmplab = imgLabel->geometry();//获得imglabel的位置

    int th = pos.x() - tmplab.x();
    int tv = pos.y() - tmplab.y() - dockWin_pos;//缩放前鼠标点在label中的坐标,这里的dockWin_pos是窗体标题的高度

    imgLabel->setPixmap(QPixmap::fromImage(m_image));      // 显示图像
    double ratio = (double)m_image.height() / (double)m_image.width();//图像的比例
    QPoint numDegrees;                                     // 定义指针类型参数numDegrees用于获取滚轮转角
    numDegrees = event->angleDelta();                      // 获取滚轮转角
    int step = 0;                                          // 设置中间参数step用于将获取的数值转换成整数型
    if (!numDegrees.isNull())                              // 判断滚轮是否转动
    {
        step = numDegrees.y();                             // 将滚轮转动数值传给中间参数step
    }
    event->accept();                                       // 获取事件
    int currentWidth = imgLabel->width();                  // 获取当前图像的宽
    int currentHeight = imgLabel->height();                // 获取当前图像的高

    double r = (double)(step) / (double)(currentWidth);  //   放缩比例

    currentWidth += step;                                  // 对当前图像的高累加
    currentHeight += (int)(step*ratio);                    // 对当前图像的宽累加
    if (step > 0)                                          // 判断图像是放大还是缩小
    {
        QString imgsize = QString("图像放大,尺寸为:%1 * %2")
            .arg(currentWidth).arg(currentHeight);
        qDebug() << imgsize;                               // 打印放大后的图像尺寸
    }
    else
    {
        QString imgsize = QString("图像缩小,尺寸为:%1 * %2")
            .arg(currentWidth).arg(currentHeight);
        qDebug() << imgsize;                                // 打印缩小后的图像尺寸
    }
    imgLabel->resize(currentWidth, currentHeight);          // 通过更新图像显示控件的大小来更新图像大小

    int move_x = r * th;
    int move_y = r * tv;

    tmph->setValue(tmph->value()+ move_x);
    tmpv->setValue(tmpv->value() + move_y);
}

到了这里,关于QT学习笔记(三)——vs2019+Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VS2019 + Qt : setToolTip的提示内容出现乱码

    在使用 setToolTip() 时, 标签提示只有英文是对的,中文是乱码! 应该是编码出了问题。默认情况下,Qt使用的是UTF-8编码,我就查看了一下这个在VS2019中cpp文件的编码: 可以看到,编码是ANSI,明显不对! 解决方法一: 我就转换了一下编码,转为UTF-8. 然后编译,中文就不再是

    2024年02月12日
    浏览(48)
  • VS2019+QT代码与QtCreator工程的互相转换

    QT Creator的project转换成Visual Studio的project 在windows10下,运行Qt Command Prompt。 输入命令行: qmake -tp vc XXX.pro 会生成文件XXX.vcxproj Visual Studio的project转成QT Creator的project 第一步,因为原Visual Studio工程就是基于QT Template的工程,所以我们可以用VS里的QT插件里的\\\"Create basic .pro file...\\\"菜

    2024年02月13日
    浏览(41)
  • VS2019搭建QT6.4开发环境【多图警告^-^】

    安装很简单,这里就不再赘述。 附上VS下载地址:Visual Studio 全家桶 这里就不绕弯子,先说明从5.15版本开始,qt需要下载在线下载器安装。 ** QT下载地址** ; 推荐使用网易邮箱或者QQ邮箱注册,因为会有回执确认操作。 勾选第二条,不要发送信息: 重点选择两个MSVC和MinGW:

    2024年02月04日
    浏览(68)
  • VS2019+OpenCV+Qt5.15.2安装及工程配置

    目录 一、下载链接 1.1 VS2019下载安装 1.2 OpenCV下载安装 1.3 Qt5.15下载安装 二、工程环境配置 2.1 OpenCV环境配置 2.1.1  环境变量配置 2.1.2 工程属性表配置  2.1.3 重启vs测试  2.2 Qt环境配置 2.2.1 Qt Creator设置  2.2.2 VS2019配置  2.2.3 创建Qt项目 2.2.4 UI 设计配置 该文件仅 1.39 MB,是 VS

    2024年02月16日
    浏览(60)
  • VS2019生成的DLL,给QT(MinGW版本)使用的小结

    a 基于生成一个DLL的工程(要注意生成是x86,还是x64的,需要和后面的QT的App工程对应),这里不多解释了,网上多的是; b 在cpp实现文件里,假如要导出一个这样的函数: 那么,它对应的头文件,如abc.h,一定如下:即在头文件里,使用了extern \\\"C\\\"来限制这个函数名,这样的

    2024年02月12日
    浏览(41)
  • VS2019+QT5.12.9环境下,调试QString无显示解决

    1、搜索 qt5.natvis.xml 文件,路径一般为C:UsersieskongAppDataLocalMicrosoftVisualStudio16.0_cb8bc8a7Extensionsoih0nd55.5jrqt5.natvis.xml,【建议使用Everything这个工具搜索] 2、复制到C:Program Files (x86)Microsoft Visual Studio2019EnterpriseCommon7PackagesDebuggerVisualizers目录下并重命名为qt5.natvis即可(如果

    2024年02月09日
    浏览(43)
  • QT5.14.2 + VS2019 + VTK8.2.0配置环境

    1.1.1 软件下载地址:Index of /archive/qt 1.1.2 安装的时候需要注意: 安装时候至少把MSVC2017 64bit选择上。 用VS2019时候,打开Qt Creator,点击工具-选项,构建套件中可能会显示黄色或者红色感叹号,这个时候就需要额外的配置。  打开VS2019,点击顶部工具 - 获取工具和功能 - 在跳出的

    2024年02月06日
    浏览(71)
  • VS中Qt项目不能打开ui文件

    在VS中创建的Qt项目,若不能打开ui文件,或者弹出以下提示的:其本质是找不到designer.exe的路径 那么需要手动添加designer.exe的路径 第一步:右键点击打不开的ui文件,选择打开方式 第二步:点击添加 第三步:点击右侧浏览查找对应的Qt编译器安装路径的designer,然后点击确定

    2024年02月13日
    浏览(51)
  • Qt6.5.1+WebRTC学习笔记(十)开发环境搭建(win10+vs2022)

    1.操作系统win10 64位 2.合理的上网方式,需要正常访问google,最好有40G以上流量 3.安装VS2022,笔者使用的是社区版,并选中C++相关,笔者设置如下        注意,win10的sdk需要是10.0.22621.0,其他版本可能导致编译不通过,而且这个版本会根据webrtc源码的更新而发生变化  4.安装

    2024年02月08日
    浏览(55)
  • 音视频源码调试前准备vs2019+qt5.15.2搭建可调试环境

    安装vs2019+qt,并且在windows环境上安装ffmpeg,尝试使用qt+cdb进行调试,尝试使用vs2019加载qt的程序。 安装VS2019+5.12.2qt环境,并进行测试。 1:安装Visual Studio 2019, a.从官网下载,或者vs2019社区版本下载地址 https://www.jb51.net/softs/700418.htm ====》 安装时必须勾选 Desktop development with C++

    2024年02月05日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包