随手写的OpenGL画圆的小程序,很简单,算是代码备忘录吧。 // widget.h #ifndef WIDGET_H #define WIDGET_H #include <QtGui/QWidget> #include <QtOpenGL> class Widget : public QGLWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); protected: void paintEvent(QPaintEvent *e); void drawCircle(); }; #endif // WIDGET_H // widget.cpp #include <QtCore> #include <QtGui> #include <QtOpenGL> #include "widget.h" Widget::Widget(QWidget *parent) : QGLWidget(QGLFormat(QGL::SampleBuffers | QGL::AlphaChannel), parent) { setAutoBufferSwap(false); setAutoFillBackground(false); showMaximized(); } Widget::~Widget() { } void Widget::paintEvent(QPaintEvent *e) { QPainter p(this); p.setRenderHints(QPainter::Antialiasing, true); int side = qMin(width(), height()); QPoint centerPoint(width() / 2, height() / 2); int ra, rb; ra = rb = side / 4; p.translate(-2 * ra, 0); p.setPen(QColor(Qt::blue)); p.drawEllipse(centerPoint, ra, rb); p.translate(4 * ra, 0); p.drawEllipse(centerPoint, ra, rb); p.end(); glPushAttrib(GL_ALL_ATTRIB_BITS); glViewport(0, 0, width(), height()); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); if (width() >= height()) gluPerspective(45.0, GLdouble(width()) / height(), 0.1, 100.0); else gluPerspective(45.0, GLdouble(height()) / width(), 0.1, 100.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_LINE_SMOOTH); glClearColor(0.0, 0.0, 0.0, 0.0); glTranslatef(0.0, 0.0, -2.0); glBegin(GL_QUADS); qglColor(Qt::green); glVertex3f( 0.5, 0.5, 0.0); qglColor(Qt::yellow); glVertex3f(-0.5, 0.5, 0.0); qglColor(Qt::blue); glVertex3f(-0.5, -0.5, 0.0); qglColor(Qt::red); glVertex3f( 0.5, -0.5, 0.0); glEnd(); drawCircle(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glPopAttrib(); p.begin(this); p.setPen(QColor(Qt::cyan)); p.setRenderHints(QPainter::Antialiasing, true); p.drawEllipse(centerPoint, ra, rb); swapBuffers(); } void Widget::drawCircle() { double radius = 0.6; const double PI = 3.141592653; glBegin(GL_LINE_LOOP); for (int i = 0; i < 360; i++) { glVertex3f(radius * cos(i * PI / 180), radius * sin(i * PI / 180), 0.0); } glEnd(); } // main.cpp #include <QtGui/QApplication> #include "widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }