Qt5怎样使用OpenGL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt5怎样使用OpenGL相关的知识,希望对你有一定的参考价值。
参考技术A 一、Qt5中OpenGL模块的重大更改1
在 Qt5 中,新增了 QOpenGL* 类,用以取代之前的 QGL* 类。
注意,虽然我们仍然能通过 Qt5 中的 OpenGL 模块使用 QGL* 类,但强烈建议大家在新的 Qt 应用程序中使用 QOpenGL* 类而不是 QGL* 类。
Qt5怎样使用OpenGL
2
另外,在 Qt5 中,已经将 OpenGL 集成到了 Gui 模块中。因此,我们要想使用与 OpenGL 相关的类和函数,只需要在 .pro 工程文件中包含 gui 模块就可以了,无需像以前一样还要包含 opengl 。
Qt5怎样使用OpenGL
END
二、怎样在Qt5中使用OpenGL
下面,我们来通过一个实际例子来演示怎样在 Qt5 中使用 OpenGL。在这个例子中,为了便于大家理解,我们只创建一个简单的背景为黑色的 OpenGL 窗口。下面是程序的运行效果图。
Qt5怎样使用OpenGL
首先,我们需要创建一个自定义的窗口类 Window。该类的父类有两个:
1)QOpenGLWindow:以公有方式继承
2)QOpenGLFunctions:以保护方式继承
另外,在通常情况下,我们还需要实现三个从父类继承的虚函数:
1)void initializeGL()
2)void resizeGL(int width, int height) //若无需对高、宽进行处理,此函数可省
3)void paintGL()
Qt5怎样使用OpenGL
然后,我们来实现上面所声明的函数。
1) initializeGL
该函数用来初始化当前的 OpenGL 环境。
注意,在此函数中,我们必须调用 initializeOpenGLFunctions(); 语句以便 Qt 在后台完成 OpenGL 环境的初始化工作。
随后,使用 glClearColor 函数来设置清除颜色。该函数的前三个参数分别是红、绿、蓝的分量值,第四个参数为透明度值。
Qt5怎样使用OpenGL
2)resizeGL
该函数主要用来对高度和宽度进行一些变化处理。当然,如果你没有什么特殊需求,也可以不处理这个函数。
Qt5怎样使用OpenGL
3)paintGL
该函数才是重头戏,绘制一般在此函数内进行。在这里,作为示范,我们只是简单地用之前设置的清除颜色来清除窗口背景。
Qt5怎样使用OpenGL
最后,我们添加一个 main.cpp 文件,在主函数中新建一个 Window 类对象,然后将其显示出来。啊哈,纵观整个过程,相比之前的 Qt 版本,在 Qt5 中使用 OpenGL 是不是超级简单呢?
Qt5怎样使用OpenGL
使用 OpenGL 和 Qt 进行科学可视化
【中文标题】使用 OpenGL 和 Qt 进行科学可视化【英文标题】:Scientific Visualization with OpenGL and Qt 【发布时间】:2009-06-18 02:52:58 【问题描述】:我正在尝试使用 Qt 为一些科学数据编写一个 OpenGL 可视化程序。我希望能够原封不动地使用我现有的程序,并且能够简单地调用 glwidget 并告诉它在每个时间步骤结束时更新数据。但是,为了运行 Qt 程序,您似乎必须使用QApplication
,然后使用qt.run()
,它会阻塞 cpu。
这是伪代码
main()
..set up stuff
myVisualizer = new myGLWidget();
for(int i=0;i<1000;i++)
..do calculations
myVisualizer.update(new data)
我意识到我可以将所有现有代码放入 QThread
并让它在连接到更新时发送一个信号。这样会更容易。有人知道如何解决这个问题吗?
【问题讨论】:
【参考方案1】:如果您真的不想研究线程解决方案,这会更好,您可以使用 0 的特殊情况超时。基本上,当您运行超时为 0 的计时器时,它会运行处理当前在事件队列中的事件后的适当代码。所以,你可以这样设置:
class MyDialog : public QDialog
Q_OBJECT
public:
MyDialog()
m_step = 0;
QTimer::singleShot( 0, this, SLOT( Process() ) );
public slots:
void Process()
// do calculations
m_step++;
QTimer::singleShot( 0, this, SLOT( Redraw() ) );
if ( m_step != 1000 )
QTimer::singleShot( 0, this, SLOT( Process() ) );
void Redraw() // do redrawing code here
private:
int m_steps;
;
然后将它与 Qt-proper 的主代码结合起来:
int main( int argc, char** argv )
QApplication app( argc, argv );
MyDialog dialog;
dialog.show();
return ( app.exec() );
【讨论】:
赞成这个答案,因为我会这样做。不需要单独的线程。但是我不认为重绘插槽需要单次计时器,以及为什么小部件是 QDialog 的子类而不是 QGLWidget。【参考方案2】:您可以在应用程序中使用 QThread 并在单独的线程中进行计算。 你要做的就是继承 QThread 并实现 run() 方法。
您可以创建一个计算器类并在该类中添加一些信号,然后将信号连接到显示小部件的更新槽(在本例中为 QGLWidget::updateGL())。
这是一个粗略的例子:(你所要做的就是在你的 main() 函数中创建一个线程和 DisplayWidget 并设置线程的 DisplayWidget。)
class Calculator: public QObject
Q_OBJECT
public:
Calculator();
void start();
signals:
void updateDisplayWidget(/* you can put the resulting data */);
;
class DisplayWidget(): public QGLWidget
Q_OBJECT
// override paint methods here
public slots:
void slotUpdateDisplayWidget(/* you can receive the resulting data*/);
;
class MyThread : public QThread
public:
void run();
void setDisplayWidget(DisplayWidget* displayWidget);
private:
Calculator mCalculator;
;
void MyThread::run()
mCalculator.start();
exec();
MyThread::setDisplayWidget(DisplayWidget* displayWidget)
displayWidget->moveToThread(this);
connect(&mCalculator, SIGNAL(updateDisplayWidget()), displayWidget, SLOT(slotUpdateDisplayWidget()));
【讨论】:
DisplayWidget 中的插槽不会在 QThread 的上下文中运行吗? 不,Qt 主事件循环处理线程,一切都会正常工作。以上是关于Qt5怎样使用OpenGL的主要内容,如果未能解决你的问题,请参考以下文章