Qt的Graphics-View框架和OpenGL结合详解

2023-11-05

QtGraphics-View框架和OpenGL结合详解

演示程序下载地址:这里

程序源代码下载地址:这里


这是一篇纯技术文,介绍了这一个月来我抽时间研究的成果。

Qt中有一个非常炫的例子:Boxes,它展示了Qt能够让其Graphics–View框架和QtOpenGL模块结合起来,渲染出非常出色的效果。其实我私自认为凭这个程序,已经有很多游戏开发者关注Qt了,因为游戏开发一个非常常见的模块就是UI,一般情况下游戏引擎提供的UI模块比较弱,基本上都是游戏引擎+第三方GUI库进行结合的。但是Qt以其Graphics–View框架能够非常轻松地将UI控件嵌入场景中,而且能够和OpenGL底层共存,更重要的是,凭借着QtqssQt可以定制许多GUI元素,这是非常具有吸引力的。所以说,如果大家对游戏开发感兴趣,那么不妨看一下Qt

好了,下面介绍一下前几天我制作并发布的一个demo。这个demo是对Boxes这个例子进行模仿,结合学习《OpenGL超级宝典》,制作而成的,由于最近比较忙,所以总共花了将近一个月才完成,不得不说效率有点儿低。

首先从MainWindow.cpp这个文件说起吧,一开始是要初始化MainWindow类的,这个类是继承QMainWindow的,这里重点说说它的构造函数:

<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">MainWindow</span><span style="color: rgb(0, 0, 0);">::MainWindow(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QWidget</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pParent</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">):</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">QMainWindow</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pParent</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">{</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">QGLWidget</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pWidget</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">new</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGLWidget</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGLFormat</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGL</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(128, 0, 128);">SampleBuffers</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">this</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pWidget->makeCurrent(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">scene</span></span></span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span style="color: rgb(0, 128, 0);">的内容</span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">GraphicsScene</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pScene</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">new</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">GraphicsScene</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">this</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">OpenGLView</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pView</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">new</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">OpenGLView</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">this</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pView->setViewport(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pWidget</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pView->setViewportUpdateMode(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGraphicsView</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(128, 0, 128);">FullViewportUpdate</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pView->setScene(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pScene</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(192, 192, 192);"> </span></span></span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span style="color: rgb(0, 128, 0);">选择不同的着色器的时候进行着色器连接</span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">connect(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pScene,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SIGNAL</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SwitchShader<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QString</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span></span></span>
<span style="color: rgb(192, 192, 192);">             </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pView,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SLOT</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SwitchShader<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QString</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">connect(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pScene,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SIGNAL</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SetLightPos<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QVector3D</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span></span></span>
<span style="color: rgb(192, 192, 192);">             </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pView,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SLOT</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SetLightPos<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QVector3D</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">setCentralWidget(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pView</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">setWindowTitle(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">tr(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">"Light</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">for</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">shader"</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">resize(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">640</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">360</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">}</span></span></span>

首先在我们创建了一个QWidget,然后调用makeCurrent()成员函数,其实意思是让它的rendercontext设为当前的rendercontext。随后建立的是OpenGLView,这个OpenGLView是来自于QGraphicsView的,它的初始化和其祖先的并无二致,随后一句非常重要:setViewport(),它的作用是将QGLWidget设置为OpenGLViewviewport,这样的话背景的rendercontext不再是rastercontext而是OpenGLcontext了,否则场景的背景还是需要用CPU渲染的,效率低下。接着是两段建立连接的代码。最后设置的是窗口大小和标题什么的,一开始还是非常简单的。


接下来我们看看OpenGLView是怎么定义的:

<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">class</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">OpenGLView</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">public</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGraphicsView</span><span style="color: rgb(0, 0, 0);">,</span></span></span>
<span style="color: rgb(192, 192, 192);">        </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">protected</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QOpenGLFunctions</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">{</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 128);">Q_OBJECT</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">public</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">OpenGLView</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QWidget</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pParent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">0</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">virtual</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">OpenGLView</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">setScene(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">GraphicsScene</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pScene<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">public</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">slots</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">bool</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">SwitchShader(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QString</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span>shaderFileName<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">SetLightPos(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QVector3D</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span>lightPos<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QVector3D</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">protected</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">resizeEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QResizeEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">mousePressEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QMouseEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">mouseReleaseEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QMouseEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">mouseMoveEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QMouseEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">wheelEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QWheelEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">drawBackground</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QPainter</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pPainter<span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QRectF</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span>rect<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">private</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">InitGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">ResizeGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">int</span><span style="color: rgb(192, 192, 192);"> </span>width<span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">int</span><span style="color: rgb(192, 192, 192);"> </span>height<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">PaintGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">DrawAxis(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">bool</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">SetupShaders(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">Camera</span><span style="color: rgb(192, 192, 192);">          </span><span style="color: rgb(128, 0, 0);">m_Camera</span><span style="color: rgb(0, 0, 0);">;</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">Format3DS</span><span style="color: rgb(192, 192, 192);">       </span><span style="color: rgb(128, 0, 0);">m_3DS</span><span style="color: rgb(0, 0, 0);">;</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(192, 192, 192);"> </span></span></span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span style="color: rgb(0, 128, 0);">着色器</span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">QOpenGLShader</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);">  </span><span style="color: rgb(128, 0, 0);">m_pVertexShader</span><span style="color: rgb(0, 0, 0);">;</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">QOpenGLShaderProgram</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 0);">m_pShaderProgram</span><span style="color: rgb(0, 0, 0);">;</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">};</span></span></span>

这里我们在它的成员中添加了一个摄像机,一个3ds模型实例,还有一个顶点着色器和着色器程序类。在上次的博客中讲到了在这种情况最好使用类指针而不是类成员作为数据成员,这里我索性把着色器程序类也做成了指针成员了。

由于OpenGLView类实现比较长,这里我着重说一下其中的几个函数。下面是drawBackground()函数的实现:

<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">OpenGLView</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">drawBackground</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QPainter</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pPainter,</span></span></span>
<span style="color: rgb(192, 192, 192);">                                 </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QRectF</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">{</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pPainter->beginNativePainting(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">glPushAttrib(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">GL_ALL_ATTRIB_BITS</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">InitGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">ResizeGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pPainter->device(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)->width(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span></span></span>
<span style="color: rgb(192, 192, 192);">              </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pPainter->device(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)->height(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">PaintGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">glPopAttrib(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pPainter->endNativePainting(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">}</span></span></span>

为什么选择drawBackground()?因为我们想要得到一种效果,OpenGL在底层绘制,上面绘制控件,其实自从QPainter有了beginNativePainting()endNativePainting()这两个函数,我们就可以进行纯OpenGL的绘制了。这里还要注意的是,因为绘制控件也是使用OpenGLcontext,这样简单调用会让OpenGL的状态混乱,所以需要将各种状态通过glPushAttrib(GL_ALL_ATTRIB_BITS);保存起来,然后初始化我们的OpenGL状态,以及绘图,最后记得glPopAttrib();还原所有状态供2D绘制。这里就不像以往的GLWidget套路了,因为GLWidget里面的initializeGL()函数只调用一次,paintGL()函数调用多次,但是在这里,只要有刷新的消息(通过update()repaint()触发),就必须调用InitGL()函数来进行OpenGL状态的设置,否则先前设置的所有状态都消失了。

接下来看看ResizeEvent()函数:

<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">OpenGLView</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">resizeEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QResizeEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pEvent</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">{</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">scene(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)->setSceneRect(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">0.0</span><span style="color: rgb(0, 0, 0);">,</span></span></span>
<span style="color: rgb(192, 192, 192);">                            </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 128);">0.0</span><span style="color: rgb(0, 0, 0);">,</span></span></span>
<span style="color: rgb(192, 192, 192);">                            </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pEvent->size(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">).width(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span></span></span>
<span style="color: rgb(192, 192, 192);">                            </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pEvent->size(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">).height(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pEvent->accept(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">}</span></span></span>

这里由于我们已经设置了sceneGraphicsScene类的实例指针,因此scene()是非空的,我们将场景限制为view的大小,这样可以避免一些刷新的问题。

paintGL()函数也是相当的简单。

<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">OpenGLView</span><span style="color: rgb(0, 0, 0);">::PaintGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">{</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">glClear(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">GL_COLOR_BUFFER_BIT</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">|</span></span></span>
<span style="color: rgb(192, 192, 192);">             </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 128);">GL_DEPTH_BUFFER_BIT</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">glPushMatrix(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 0);">m_Camera</span><span style="color: rgb(0, 0, 0);">.Apply(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 0);">m_3DS</span><span style="color: rgb(0, 0, 0);">.RenderGL(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">if</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>g_ShowAxis<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">DrawAxis(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">glPopMatrix(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">}</span></span></span>

接着我向大家介绍一下GraphicsScene类:

<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">class</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">GraphicsScene</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">public</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGraphicsScene</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">{</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 128);">Q_OBJECT</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">public</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">GraphicsScene</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QObject</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pParent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">0</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">SetCamera(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">Camera</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pCamera<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">signals</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">SwitchShader(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QString</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span>shaderFileName<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">SetLightPos(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QVector3D</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span>pos<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">protected</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">mousePressEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGraphicsSceneMouseEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">mouseMoveEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGraphicsSceneMouseEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">mouseReleaseEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGraphicsSceneMouseEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">wheelEvent</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QGraphicsSceneWheelEvent</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span>pEvent<span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">private</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">slots</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">Feedback(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">void</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">private</span><span style="color: rgb(0, 0, 0);">:</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(192, 192, 192);"> </span></span></span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span style="color: rgb(0, 128, 0);">鼠标事件需要</span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">QPointF</span><span style="color: rgb(192, 192, 192);">         </span><span style="color: rgb(128, 0, 0);">m_LastPos</span><span style="color: rgb(0, 0, 0);">;</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">Camera</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);">         </span><span style="color: rgb(128, 0, 0);">m_pCamera</span><span style="color: rgb(0, 0, 0);">;</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">};</span></span></span>

这里的GraphicsScene类保存的是来自viewCamera和一些信号以及事件的处理。在实现上也说一下它的构造函数吧。

<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">GraphicsScene</span><span style="color: rgb(0, 0, 0);">::GraphicsScene(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QObject</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pParent</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">):</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">QGraphicsScene</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pParent</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 0);">m_pCamera</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">Q_NULLPTR</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">{</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">ClickableTextItem</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pTextItem</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">new</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">ClickableTextItem</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">Q_NULLPTR</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pTextItem->setPos(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">10.0</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">10.0</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pTextItem->setHtml(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">tr(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">"<font</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">color=white>"</span></span></span>
<span style="color: rgb(192, 192, 192);">                            </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">"Made</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">By</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">Jiangcaiyang<br>"</span></span></span>
<span style="color: rgb(192, 192, 192);">                            </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">"Created</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">in</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">September<br>"</span></span></span>
<span style="color: rgb(192, 192, 192);">                            </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">"Click</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">for</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 128, 0);">feedback."</span></span></span>
<span style="color: rgb(192, 192, 192);">                            </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 128, 0);">"</font>"</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">connect(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pTextItem,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SIGNAL</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>Clicked<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span></span></span>
<span style="color: rgb(192, 192, 192);">             </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">this</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SLOT</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>Feedback<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">addItem(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pTextItem</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">ShaderOptionDialog</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pDialog</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">new</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">ShaderOptionDialog</span><span style="color: rgb(0, 0, 0);">;</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">connect(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pDialog,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SIGNAL</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SwitchShader<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QString</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span></span></span>
<span style="color: rgb(192, 192, 192);">             </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">this</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SIGNAL</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SwitchShader<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QString</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">connect(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pDialog,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SIGNAL</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SetLightPos<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QVector3D</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">),</span></span></span>
<span style="color: rgb(192, 192, 192);">             </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 128, 0);">this</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">SIGNAL</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span>SetLightPos<span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 128, 0);">const</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">QVector3D</span><span style="color: rgb(0, 0, 0);">&</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(128, 0, 128);">QGraphicsProxyWidget</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pProxy</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">addWidget(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">pDialog,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">Qt</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(128, 0, 128);">Window</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(128, 0, 128);">Qt</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(128, 0, 128);">WindowTitleHint</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="color: rgb(192, 192, 192);">    </span><span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">pProxy->setPos(</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">100</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 128);">200</span><span style="color: rgb(192, 192, 192);"> </span><span style="color: rgb(0, 0, 0);">);</span></span></span>
<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US"><span style="color: rgb(0, 0, 0);">}</span></span></span>

我们创建了一个ClickableTextItem类,它继承于QGraphicsTextItem,它被摆在左上角,显示三排可以点击的文字。随后添加了一个对话框,设置信号和槽完毕后就用代理放入场景中了。整个过程也是非常简单的。

我测试了下,整个程序在我的Ubuntu13.04下能够正常运行。只是由于显卡不同(Ubuntu下较难支持nvidia显卡,使用的是intel集显),specularOpt效果出不来。





FROM: http://blog.csdn.net/gamesdev/article/details/12073065?utm_source=tuicool&utm_medium=referral

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt的Graphics-View框架和OpenGL结合详解 的相关文章

  • 据说还有比Mybatis Plus好用的ORM框架?还是阿里出的!

    来源 juejin cn post 6886019929519177735 使用fluent mybatis可以不用写具体的xml文件 通过java api可以构造出比较复杂的业务sql语句 做到代码逻辑和sql逻辑的合一 不再需要在Dao
  • Linux系统管理实践(2):OpenSSH远程管理配置

    OpenSSH是SSH Secure SHell 协议的免费开源实现 它用安全 加密的网络连接工具代替了telnet ftp rlogin rsh和rcp工具 OpenSSH支持SSH协议的版本1 3 1 5和2 SSH协议族可以用来进行远
  • 6.5V~65V用于电动自行车/汽车照明的同步降压恒流芯片LN4524

    6 5V 65V用于电动自行车 汽车照明的同步降压恒流芯片LN4524 LN4524 是一款外围电路简单 连续工作模式非隔离式恒流 LED 驱动控制芯片 LN4524 采用了 PWM 工作模式 在应用中可以采用较小值的电感 芯片外置 PMO
  • vivado创建IP时出现IP_Flow 19-3153] Bus Interface ‘user_clk‘: ASSOCIATED_BUSIF bus parameter is missing解决

    我新建IP时 里面添加了一个自己的输入时钟 系统默认给添加到了时钟和复位信号里面了 如下图箭头指示 然后提示 解决办法 其实就是按照其提示给这个信号添加bus parameter ASSOCIATED BUSIF 右键单击上图红色箭头指示的
  • Scrapy中使用Selenium

    Scrapy中使用Selenium可以通过以下步骤实现 1 安装Selenium库 可以通过pip安装selenium库 pip install selenium 2 下载浏览器驱动 Selenium需要浏览器驱动来控制浏览器 可以下载对应
  • Win10 安装系统跳过创建用户,直接启用 Administrator

    oobe 到创建用户那里 第一种方法 按 shift F10 打开 cmd 输入 lusrmgr msc 将 administrator 启用 关闭 lusrmgr msc 回到 cmd 输入 taskmgr exe 打开任务管理器 结束进
  • (三) 计算机图形学 之 Shader 定义 (顶点 着色器)

    shader 决定材质 跟灯光的作用 shader 属性定义的通用格式 Properties Property Property 相当于一个类的公共变量 Properties 定义一个Int name display name Int 1
  • 身份证省市区SQL代码

    转载自 https blog csdn net xiaofanku article details 18085865 身份证号码的意义 前1 2位数字表示 所在省份的代码 第3 4位数字表示 所在城市的代码 第5 6位数字表示 所在区县的代
  • JWT讲解

    目录 什么是JWT 为什么会出现JWT cookie session模式 JWT模式 JWT认证过程 JWT数据格式 优点 缺点 什么是JWT 为什么会出现JWT cookie session模式 传统cookie session模式是通过
  • stm32中断详解

    中断介绍 1 在单片机系统中 如果遇到需要紧急处理的突发事件时 CPU需要迅速的作出反应 暂停正在运行的程序来处理突发事件 这时就需要中断 2 中断是指单片机正在执行程序的时 发生突发事件从而打断当前程序 转而去处理这一事件 当处理完成后再
  • this.el_.vjs_getProperty is not a function

    前言 在使用video js播放rtmp视频中切换页面 如果是弹框引入 关闭弹框时 必然会发现控制台报错这个 这是谈谈我这边遇到的这个问题 以及怎么解决的 问题 在说这个问题怎么解决之前 先说一下我这边的应用场景 以及遇到的问题 我这边使用

随机推荐

  • 高端大气的艺术海报的ps教程

    Step 1海报尺寸宽和高为768 1152像素 分辨率150像素 英寸 背景白色 Step 2 确定了之后复制背景图层 双击图层进入图层样式 选择渐变叠加 颜色渐变绿色到蓝色 线性渐变 Step 3 用椭圆工具绘制正圆填充颜色白色 大小为
  • 竞赛——【蓝桥杯】2022年11月第十四届蓝桥杯模拟赛第一期Java

    1 二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数 在二进制中对应 10 是 2 位数 十进制整数 22 在十进制中是 2 位数 在二进制中对应 10110 是 5 位数 请问十进制整数 2022 在二进制中是几位数 答案提交
  • 外网访问内网kafka无法链接

    根据业务需要 需要在外网访问内网的kafka 外网设备给内网推送数据 以为只需要通过NGINX代理kafka的端口就可以了 但是实际上端口代理后 端口可以链接 但是无法推送数据 猜测大概原因是因为 kafka是将链接信息注册到zookeep
  • 香港Web3欲戴王冠,银行如何承受合规之重?

    前言 6月19日 据明报报道 香港金融管理局 HKMA 总裁余伟文针对虚拟资产交易平台在香港银行开户难问题表示 一向有与香港银行有交流 交流时是否有压力则大家感觉不一 上周四 HKMA向汇丰银行 渣打银行和中国银行施压 要求其接受加密交易所
  • 后钢板弹簧吊耳—铣叉口两内侧面夹具设计

    摘 要 本次设计是对后钢板弹簧吊耳零件的加工工艺规程及一些工序的专用夹具设计 后钢板弹簧吊零件的主要加工表面是平面及孔 由加工工艺原则可知 保证平面的加工精度要比保证孔的加工精度容易 所以本设计遵循先面后孔的原则 并将孔与平面的加工明确划分
  • mysql中LEFT JOIN分页时的优化方法

    引言 查询的时候使用LEFT JOIN 配合分页要怎么优化 正文 常见的 分页SQL SELECT FROM table1 t1 LEFT JOIN table2 t2 ON t2 id t1 id LEFT JOIN table3 t3
  • 双点双向重发布小实验

    要求 1 如图搭建网络拓扑 所有路由器各自创建一个环回接口 合理规划IP地址 2 R1 R2 R2 R4 R6之间运行OSPF协议 R4 R5 R6之间运行RIP协议 3 R1环回重发布方式引入OSPF网络 4 R4 R6双点双向重发布 5
  • 华为OJ(记负均正)

    描述 从输入任意个整型数 统计其中的负数个数并求所有非负数的平均值 输入 输入任意个整数 输出 输出负数个数以及所有非负数的平均值 注意 当输入的数字的个数未知时 ivec的用法 以 0结束输入 样例测试 输入 13 4 7 输出 3 0
  • 20230904 QT客户端服务器搭建聊天室

    Ser cpp include app h include ui app h APP APP QWidget parent QWidget parent ui new Ui APP ui gt setupUi this this gt re
  • 设置git bash打印log的颜色

    在git安装目录下的 gitconfig文件中编辑 color diff auto status auto branch auto interactive true ui true alias hist log color graph pr
  • 人工智能正在重塑生产方式、优化产业结构、提升生产效率、赋能千行百业

    近日 清华大学科技情报大数据挖掘与服务系统平台AMiner发布 人工智能发展报告2011 2020 阐述过去十年人工智能取得的重要成果 探讨人工智能未来发展前景与蓝图 含此在内 多项人工智能研究报告均引发业界广泛关注 专家表示 作为引领新一
  • 如何方便的去除返回Date时间戳后面的0(或者做其他设置)

    这是get请求后 返回个前端的时间戳 可以看到后面有三个的0 如何去除这0呢 但我们在java里面返回的类又是date 有两个方法 一 重新定义返回视图对象 将createTime 和 updateTime定义为long 然后在赋值的时候更
  • DataGridView控件用法(二):为每行记录最后加“编辑”-“删除”按钮列

    1 在DataGridView控件用法 一 中已经显示出列表数据 这时我们需要对每行数据记录进行编辑 需要添加 编辑 删除 查看 这样的超链接 代码如下 view source print 1 为每行数据增加编辑列 2 设定列不能自动作成
  • Ansible自动化运维详细教程及playbook详解

    Ansible 一种集成 IT 系统的配置管理 应用部署 执行特定任务的开源平台 是 AnsibleWorks 公司名下的项目 该公司由 Cobbler 及 Func 的作者于 2012 年创建成立 Ansible 基于 Python 语言
  • Kafka3.0.0版本——消费者(消费者组原理)

    目录 一 消费者组原理 1 1 消费者组概述 1 2 消费者组图解示例 1 3 消费者组注意事项 一 消费者组原理 1 1 消费者组概述 Consumer Group CG 消费者组 由多个consumer组成 形成一个消费者组的条件 是所
  • vue3+vite配置全局scss

    首先下载scss sass loader sass npm install save dev sass loader npm install save dev node sass npm install save dev sass 打开vi
  • 西门子博图指令(定时器操作四)

    定时器功能指令介绍四 综述 加载脉冲定时器持续时间 介绍 程序 程序演示 加载接通延时定时器持续时间 介绍 程序 程序演示 加载关断延时定时器持续时间 介绍 程序 程序演示 加载时间累加器持续时间 介绍 程序 程序演示 源程序 综述 主要介
  • R语言 删除空行

    data lt data complete cases data 5 6 删除第五六列有空值的行 data lt na omit data 删除有空值的行 转载于 https www cnblogs com shilo930 p 11057
  • Nginx配置

    Nginx配置 一 nginx常用配置命令 二 nginx配置文件 一 第一部分 全局块 二 第二部分 events块 三 第三部分 http块 1 http全局块 2 server块 3 location块 三 nginx配置反向代理 一
  • Qt的Graphics-View框架和OpenGL结合详解

    Qt的Graphics View框架和OpenGL结合详解 演示程序下载地址 这里 程序源代码下载地址 这里 这是一篇纯技术文 介绍了这一个月来我抽时间研究的成果 Qt中有一个非常炫的例子 Boxes 它展示了Qt能够让其Graphics