qt的opengl开发(qopenglwidget)(初始化,画线,平移,局部缩放)2d开发_qopenglwidget 图片 比例-程序员宅基地

技术标签: qt  opengl  

最近因为项目原因,涉及显示图像,其实只是单纯的划线,但是线条的数量很庞大,所以需要用到opengl来提升性能,一些基础功能也是琢磨的3天左右,基本上是出来了。
下面直接看代码:
初始化:
在这里插入图片描述
用qopenglwidget这三个函数必须有

void GLWidget::initializeGL()
{
    
    initializeOpenGLFunctions();  //这个是qt使用opengl方法接口
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);  //设置窗体背景色
    int w = this->width();
    int h = this->height();
    glOrtho(0.0,w,h,0.0,-1.0,1.0);   //这个代表截取屏幕,这里我这里截取整个屏幕
}

第一次运行程序的时候,会设置一次窗体大小,执行

void GLWidget::resizeGL(int w, int h)
{
    
    glViewport(0, 0, w, h);  //这里是显示窗体,上面有截取,这里才有显示。不然窗口不会显示任何内容
}

接下来就是绘制图像了:

void GLWidget::paintGL()
{
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glColor3f(0.0, 0.0,0.0);
    for(int i=0;i<m_SatrtXList.size();i++)   //这里我是画了100万条线。速度大概1秒左右
    {
    
        glLineWidth(1);
        glBegin(GL_LINES);  //画线
        glVertex2d(m_SatrtXList[i],m_SatrtYList[i]);  //开始点(x,y)
        glVertex2d(m_EndXList[i],m_EndYList[i]);  //结束点 (x,y)
        glEnd();
    }
}

注意,qopenwidget所有的绘制只能在paintGL中进行,所有的操作只能传值进入paintGL进行绘制。

平移:
平移和qt的无边框窗口移动很像。

void GLWidget::mousePressEvent(QMouseEvent *event)
{
    
    if(event->button()==Qt::LeftButton)
    {
    
        m_bClicked=true;
        pLast = event->globalPos() - this->pos();   //点击之后获取当前位置(记录当前点)
    }
}

松开鼠标,这个没什么好说的。

void GLWidget::mouseReleaseEvent(QMouseEvent *event)
{
    
    m_bClicked=false;
}

重点来了。
在鼠标移动的时候,一直获取当前位置

void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
    
    if (event->buttons() && Qt::LeftButton&&m_bClicked)
    {
    
        m_MovePoint=event->globalPos();
        qDebug()<<"m_MovePoint::"<<m_MovePoint<<"pLast::"<<pLast;
        glFlush();  //刷新界面  理论上应该这个就会执行paintGL,但是不行,还需要update一下
        update(); 
    }

}

在paintGL中增加以下代码:

在这里插入图片描述
这样我们就实现了平移。

接下来我们需要实现局部缩放。
如果只是需要淡出的缩放,那么直接使用opengl的函数 glScalef(scalex,scaley,scalez); 2d开发的话scalez为0;
但是我们还需要局部进行放大,其实局部放大无非就是在放大之前进行平移坐标到鼠标位置,但是如何移动到精准位置,需要使用一定比例进行缩放。

void GLWidget::wheelEvent(QWheelEvent *event)
{
    
    m_Point= event->globalPos();  //获取当前位置,注意所有的坐标都是相对于桌面的坐标
    m_Fzoom=1;   //设置默认缩放比例   opengl有一个毛病,就是他认为只有比初始值大为放大
    //比初始值小为缩小,所以每次都设置一次初值
    m_bWheel=true;
    qDebug()<<"point:"<<m_Point;
    if(event->delta() > 0) {
    
            m_Fzoom += 0.1;  //滚轮 向上  
        } else {
    
            m_Fzoom -= 0.1;
        }
    glFlush();
    update();
}

在paintGL中加入以下代码

    if(m_bWheel)
    {
    
    	//进行平移,如果不需要局部则把平移部分去掉。
        glTranslatef(m_Point.x()*(1-m_Fzoom),m_Point.y()*(1-m_Fzoom),0);
        glScalef(m_Fzoom, m_Fzoom, 0.0);
    }
    m_Fzoom=1;
    m_bWheel=false;

这样的话局部缩放也完成了,那么我们来看下效果图。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43676892/article/details/113252437

智能推荐

JAXB实现XML和Bean互相转换_jaxb xml 转 bean 跨层-程序员宅基地

文章浏览阅读957次。基于JAXB实现xml与bean的互相转换import java.io.IOException;import java.io.StringReader;import java.io.StringWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml...._jaxb xml 转 bean 跨层

中国地图shp文件_使用 GEOJSON 文件绘制县级和市级中国地图-程序员宅基地

文章浏览阅读2.1k次。连享会-文本分析与爬虫专题研讨班诚邀助教:连享会-文本分析与爬虫专题这篇教程的内容比较。。。丧心病狂。旨在演示灵活组合 geojson 文件绘制复杂的区域地图。我首先是将 34 个省级的 GEOJSON 文件组合起来绘制了市级中国地图,然后又将 344 个市级的 GEOJSON 文件组合起来绘制了县级中国地图。当然绘制县级和市级中国地图的最好办法是使用之前我提供的 shp 文件。除此之外..._中国县域shp文件

Linux虚拟机(Ubuntu)字体大小的调节。_虚拟机linux修改字体大小-程序员宅基地

文章浏览阅读3.7k次,点赞4次,收藏11次。Linux虚拟机(Ubuntu)字体大小的调节。_虚拟机linux修改字体大小

分享一个开源的古诗词数据库(约7w+古诗词/3k+诗人)-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏33次。项目的Github地址:poetry古诗词数据库这个古诗词数据库是2017年从古诗文网爬取下来的,目前的数据总量虽不及古诗文网,但其诗词数据进行了一定的清洗整理和格式化,方便给需要的人做研究或者做些创意。这个古诗词数据库目前主要有73281首古诗词和3156个诗人的详细数据,并且已经应用在两个应用上:诗鲸Android客户端和诗鲸微信小程序。数据说明1.gushiwen 文件夹这个文件..._诗词 github

机器学习之softmax_softmax层-程序员宅基地

文章浏览阅读2.6k次。###################全连接网络定义部分########################def __init__(self, num_input, num_output): # 全连接层初始化# 参数初始化def forward(self, input): # 前向传播计算# 全连接层的前向传播,计算输出结果self.output = np.matmul(self.input,self.w)+self.b#利用矩阵乘法(Y=XW+B)——(n,c)_softmax层

Android网络编程基础之TCP/IP_android tcp传输乱序-程序员宅基地

文章浏览阅读1k次。作业:画下三次握手,四次挥手的时序图。计算机网络体系结构各层的关系每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。程序员重点关注TCP/IP模型,OSI七层模型了解即可。TCP/IP协议族定义Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。协议采用了4层的层级结构。然而在很多情况_android tcp传输乱序

随便推点

[音乐]阿桑的《叶子》_搜索 阿桑《叶子》-程序员宅基地

文章浏览阅读1.5k次。昨天在网上闲逛时无意中听到这首歌,感觉非常棒,到网上搜了一把,找到一些资料:“阿桑的首张专辑《受了点伤》标榜“秋天到了,请尽情悲伤”,很清楚地点出这张专辑的制作企图与产品定位。由于阿桑的嗓音天生沙哑富有磁性,很适合煽起听者的悲伤情绪,因此这张专辑在制作之前,唱片公司内部上上下下毫无疑义的,一致决定作一张‘很悲伤’的唱片。卸下追求流行前卫曲风的包袱,制作的标准只有2个字:“感情”,企图以真实_搜索 阿桑《叶子》

《吊打面试官》系列-Redis基础-程序员宅基地

文章浏览阅读426次,点赞2次,收藏4次。你知道的越多,你不知道的越多 点赞再看,养成习惯前言叮当小说网 wap.guxs.netRedis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(请允许我使用一下夸张的修辞手法),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在...

Web安全工具大集合-程序员宅基地

文章浏览阅读4.3k次。Test sites / testing groundsSPI Dynamics (live) – http://zero.webappsecurity.com/Cenzic (live) – http://crackme.cenzic.com/Watchfire (live) – http://demo.testfire.net/Acunetix (live) – http:

MySQL开发技巧 - 分页和索引_本关任务:能分页读取表中数据,针对大数据量进行简单优化。-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏3次。第1关:MySQL 分页查询本关任务:能分页读取表中数据,针对大数据量进行简单优化。USE Products;#请在此处添加实现代码########## Begin ###########1.分页查询select prod_id from products limit 5,5;#2.用子查询优化分页查询语句select prod_id from products where prod_id >=(select prod_id from products limit 10,1) l_本关任务:能分页读取表中数据,针对大数据量进行简单优化。

WPF 控件专题 Image控件详解_wpf image-程序员宅基地

文章浏览阅读5.3k次。WPF 控件专题 Image控件详解_wpf image

OMPL库学习笔记0--写在前面_ompl time-程序员宅基地

文章浏览阅读2.7k次。 从今天开始学习OMPL库函数,自己是一个没有恒心的人,而OMPL库又实在比较庞大,这算是写在前面的自我鼓励吧。记录这些学习笔记是自我加深认识的一个过程,肯定存在许多错误,希望有看到错误的小伙伴可以不吝指教,也希望可以和大家多多交流,相互学习。 在了解OMPL库之前还有一步是必须的,那就是下载OMPL库,就像我们看一本书,你总得先有这本书吧 我自己在网上找了一..._ompl time

推荐文章

热门文章

相关标签