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

智能推荐

Qt4.6 QMessageBox 使用大全_qmessagebox使用-程序员宅基地

文章浏览阅读2.1k次。使用方式为/***消息框的使用 *********************///提示框//QMessageBox::about(this,"about me","helloworld");// QMessageBox::aboutQt(this,"about me"); //输出关于Qt的详细信息//警告窗口//int bs= QMessageBox::critica_qmessagebox使用

互联网的下半场:社交媒体与消费场景革命_社交媒体推动消费场景潮流化-程序员宅基地

文章浏览阅读740次。作者:幻梦邪魂全文共 3450 字,阅读需要 7 分钟———— / BEGIN / ————亚里士多德说:人们为了生存来到了城市,为了生活的更好,留在了城市。那么,亚里士多德的“城市”又是什么?它就是一种更高效的、现代化的,分工协作的人类“消费场景”。随着人类文明的发展以及科学技术的进步,人们已经基本完成了从生理、安全需求到社会、尊重需求的过度,并在不断的尝试自我超越——尤其是在互联网出现后,短短_社交媒体推动消费场景潮流化

III. 使用Spring Boot_spring boot yarn application-程序员宅基地

文章浏览阅读419次。使用Spring Boot本章节将会详细介绍如何使用Spring Boot。它覆盖了构建系统,自动配置和运行/部署选项等主题。我们也覆盖了一些Spring Boot最佳实践。尽管Spring Boot没有什么特别的(只是一个你能消费的库),但仍有一些建议,如果你遵循的话将会让你的开发进程更容易。如果你刚接触Spring Boot,那最好先读下上一章节的Getting Started指南。构建系统强烈_spring boot yarn application

【毕业设计】基于SpringBoot的高端护肤品商城的设计与实现_基于springbioot的化妆品商城-程序员宅基地

文章浏览阅读1k次,点赞18次,收藏21次。基于Spring Boot的高端护肤品商城可以设计和实现以下功能:用户注册与登录:提供用户注册和登录功能,确保用户可以创建和管理自己的账户,以便进行购物和查看订单等操作。商品展示与搜索:展示高端护肤品的商品列表,并支持根据关键字、品牌、价格范围等条件进行搜索和筛选,方便用户快速找到所需商品。商品详情页:展示单个商品的详细信息,包括商品描述、价格、成分、使用方法等,以及用户对商品的评价和评分。购物车功能:允许用户将感兴趣的商品添加到购物车中,方便稍后统一结算和下单。_基于springbioot的化妆品商城

Ubuntu命令行自动下载安装配置Java环境_ubuntu命令下载java-程序员宅基地

文章浏览阅读908次。原文英文需求 对于在Ubuntu平台做Java/Android开发的小伙伴们来说, JDK的安装和配置一定不是一件省心的事儿 ;P 下面就以安装 Oracle Java(JDK) 8为例子,通过几行命令优雅的搞定他吧 ~1.添加源 戳我sudo add-apt-repository ppa:webupd8team/java2.添加Keysudo apt-key adv --keyserver_ubuntu命令下载java

初学FLEX做的小练习(一)-静态页面部分-程序员宅基地

文章浏览阅读188次。前言:练习涉及到FLEX常用控件,与后台交互的数据服务(RemoteObject,WebService),FLEX的几种导航,FLEX事件。相关工程代码请下载 http://download.csdn.net/detail/iamyzs/4284826 一、相关软件Flex Builder4MyEclipse5.5tomcat6.0(我的路径 D:\apache-tomc..._ru.stablex.ui.widgets.viewstack

随便推点

使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比表示_使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比表示-程序员宅基地

文章浏览阅读2.7k次,点赞6次,收藏25次。题目:使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比表示。例如:把文件A复制到E盘某文件夹下,在控制台上显示“XXX文件已复制10%”,“XXX文件已复制20%”……“XXX文件已复制100%”,“XXX复制完成!”代码如下:1、Runnable接口方式package com.day505.testdemo.exam;import java.io.*;imp..._使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比表示

【TA100】Bloom算法_unity bloom-程序员宅基地

文章浏览阅读492次。● Bloom,也称辉光,是一种常见的屏幕效果● 模拟摄像机的一种图像效果,让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果● 可以让物体具有真实的明亮效果● 可以实现光晕效果。_unity bloom

qchart 坐标轴设置_QChart学习之QValueAxis坐标轴设置-程序员宅基地

文章浏览阅读8.2k次。QChart 坐标轴设置// 添加轴QValueAxis *xAxis = new QValueAxis();QValueAxis *yAxis = new QValueAxis();// 坐标轴整体xAxis->setRange(0, 10);yAxis->setRange(0, 10);// 轴标题设置xAxis->setTitleText(QStringLiteral("时..._qchart 坐标轴

foobar2000下播放DSD音乐的插件-程序员宅基地

文章浏览阅读3.6k次。需要测试foobar下面DSD的播放插件,翻遍了度娘,找不到一个容易下载的地方,要不一大堆广告,要不就是需要账号,烦死了,总是设置了很多障碍。其实这东西是人家老外开发的,最原始的插件名字叫做foo_input_sacd-0.6.5.zip, 在下面这个地址可以下载到:http://downloads.sourceforge.net/project/sacddecoder/foo_input_sac..._foobar2000 sacd 官方插件

Android 手机自动化测试工具有哪几种?_安卓自动化软件-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏15次。移动端自动化测试工具的原理通过编程语言和UI交互模拟,来实现自动化测试。并通过元素定位、测试用例管理、并发测试、自动化脚本扩展性和自动化测试集成等功能,来提高测试效率和测试质量。1. 基于编程语言通过编写程序来实现自动化测试。通常使用的编程语言有Java、Python、Ruby等。2. UI交互模拟模拟用户与应用程序的交互,包括点击、输入、滑动、拖拽等UI操作。3. 元素定位通过元素定位来定位应用程序中的控件元素,如:文本框、按钮、下拉框等。_安卓自动化软件

操作系统实验五、进程互斥实验——理发店问题_设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏52次。问题描述理发店问题:假设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过 20 人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本..._设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳

推荐文章

热门文章

相关标签