OpenGL是绘制三维图形的标准API。Qt应用程序可以使用QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库。Qt OpenGL模块提供QGLWidget类,可以通过对它子类化,并使用OpenGL命令开发出自己的窗口部件。对许多三维应用程序来说,这就足够了。
这节假设大家都已经学过OpenGL,这样我们就无后顾之忧了。
在Qt中绘制OpenGL通常需要做以下工作:1)、必须子类化QGLWidget;2)、实现几个虚函数:void initiallizeGL()
void resizeGL(), void paintGL(), 这些都是在QGLWidget中实现的,还有一些和用户交互的虚函数,诸如void mouseMoveEvent()之类的,想必大家都比较熟了,这些虚函数是在Widget中实现的。
下面我们介绍一个例子。先给出该程序的效果:
菜单栏里的第一项可以完成一个自定义大小的抓图,即由用户自己决定抓图的大小,抓图会显示在右侧的方框里,注意这里只能设置图形的大小小雨当前图形的尺寸, 如果大于当前图形尺寸,则钳位到当前图形尺寸。效果 看起来应该是这样:
菜单栏第二项也是一个抓图功能,它返回一个当前图形尺寸的图形,并填充到右侧。
第三项即清除右侧图形。
这个代码由以下部件构成:
一个QMainWindow,我们通过子类化这个类来完成自己想要的一些功能。
一个QWidget,我们把它作为中央窗口,在其上添加自己想要的一些子部件。
两个QScrollBar,用来盛载一个QGLWidget和一个QLabel。
一个QGLWidget,我们通过子类化它并把它加进一个QScrollBar来实现三维绘图,即上图所示的左边窗口。
一个QLabel,同样,我们把这个QLabel加进一个QScrollBar来接收抓图后的显示效果。
三个QSlider,我们通过这三个滑动条控制所绘制的四面体沿x,y,z轴转动,同样鼠标拖动这个四面体也可以改变滑动条的值。
以上是整个程序的框架。
以下是代码的实现部分。
MainWindow 类定义了我们整个程序的框架:
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
class QAction;
class QLabel;
class QMenu;
class QSlider;
class QScrollArea;
class GLWidget;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void renderIntoPixmap();
void grabFrameBuffer();
void clearPixmap();
void about();
private:
void createMenus();
void createActions();
QSlider *createSlider(const char *changedSignal, const char *setterSlot);
void setPixmap(const QPixmap &pixmap);
QSize getSize();
QWidget *centralWidget;
QScrollArea *glWidgetArea;
QScrollArea *pixmapLabelArea;
GLWidget *glWidget;
QLabel *pixmapLabel;
QSlider *xSlider;
QSlider *ySlider;
QSlider *zSlider;
QMenu *fileMenu;
QMenu *helpMenu;
QAction *renderIntoPixmapAction;
QAction *grabFrameBufferAction;
QAction *clearPixmapAction;
QAction *exitAction;
QAction *aboutAction;
QAction *aboutQtAction;
};
#endif // MAINWINDOW_H
以下是程序的实现部分:
//mainwindow.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include "main