最近因为项目原因,涉及显示图像,其实只是单纯的划线,但是线条的数量很庞大,所以需要用到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;
这样的话局部缩放也完成了,那么我们来看下效果图。
文章浏览阅读2.1k次。使用方式为/***消息框的使用 *********************///提示框//QMessageBox::about(this,"about me","helloworld");// QMessageBox::aboutQt(this,"about me"); //输出关于Qt的详细信息//警告窗口//int bs= QMessageBox::critica_qmessagebox使用
文章浏览阅读740次。作者:幻梦邪魂全文共 3450 字,阅读需要 7 分钟———— / BEGIN / ————亚里士多德说:人们为了生存来到了城市,为了生活的更好,留在了城市。那么,亚里士多德的“城市”又是什么?它就是一种更高效的、现代化的,分工协作的人类“消费场景”。随着人类文明的发展以及科学技术的进步,人们已经基本完成了从生理、安全需求到社会、尊重需求的过度,并在不断的尝试自我超越——尤其是在互联网出现后,短短_社交媒体推动消费场景潮流化
文章浏览阅读419次。使用Spring Boot本章节将会详细介绍如何使用Spring Boot。它覆盖了构建系统,自动配置和运行/部署选项等主题。我们也覆盖了一些Spring Boot最佳实践。尽管Spring Boot没有什么特别的(只是一个你能消费的库),但仍有一些建议,如果你遵循的话将会让你的开发进程更容易。如果你刚接触Spring Boot,那最好先读下上一章节的Getting Started指南。构建系统强烈_spring boot yarn application
文章浏览阅读1k次,点赞18次,收藏21次。基于Spring Boot的高端护肤品商城可以设计和实现以下功能:用户注册与登录:提供用户注册和登录功能,确保用户可以创建和管理自己的账户,以便进行购物和查看订单等操作。商品展示与搜索:展示高端护肤品的商品列表,并支持根据关键字、品牌、价格范围等条件进行搜索和筛选,方便用户快速找到所需商品。商品详情页:展示单个商品的详细信息,包括商品描述、价格、成分、使用方法等,以及用户对商品的评价和评分。购物车功能:允许用户将感兴趣的商品添加到购物车中,方便稍后统一结算和下单。_基于springbioot的化妆品商城
文章浏览阅读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
文章浏览阅读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..._使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比表示
文章浏览阅读492次。● Bloom,也称辉光,是一种常见的屏幕效果● 模拟摄像机的一种图像效果,让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果● 可以让物体具有真实的明亮效果● 可以实现光晕效果。_unity bloom
文章浏览阅读8.2k次。QChart 坐标轴设置// 添加轴QValueAxis *xAxis = new QValueAxis();QValueAxis *yAxis = new QValueAxis();// 坐标轴整体xAxis->setRange(0, 10);yAxis->setRange(0, 10);// 轴标题设置xAxis->setTitleText(QStringLiteral("时..._qchart 坐标轴
文章浏览阅读3.6k次。需要测试foobar下面DSD的播放插件,翻遍了度娘,找不到一个容易下载的地方,要不一大堆广告,要不就是需要账号,烦死了,总是设置了很多障碍。其实这东西是人家老外开发的,最原始的插件名字叫做foo_input_sacd-0.6.5.zip, 在下面这个地址可以下载到:http://downloads.sourceforge.net/project/sacddecoder/foo_input_sac..._foobar2000 sacd 官方插件
文章浏览阅读1.5k次,点赞2次,收藏15次。移动端自动化测试工具的原理通过编程语言和UI交互模拟,来实现自动化测试。并通过元素定位、测试用例管理、并发测试、自动化脚本扩展性和自动化测试集成等功能,来提高测试效率和测试质量。1. 基于编程语言通过编写程序来实现自动化测试。通常使用的编程语言有Java、Python、Ruby等。2. UI交互模拟模拟用户与应用程序的交互,包括点击、输入、滑动、拖拽等UI操作。3. 元素定位通过元素定位来定位应用程序中的控件元素,如:文本框、按钮、下拉框等。_安卓自动化软件
文章浏览阅读5.3k次,点赞3次,收藏52次。问题描述理发店问题:假设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过 20 人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本..._设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳