zoukankan      html  css  js  c++  java
  • 第一个复制成功的Qt Demo(续)

    4.修改tetrahedron.h代码

    此处一定要

    #include <QtGui/QtGui>

    #include <QtOpenGL/QtOpenGL>
    不知道为何,如果要使用QGLWidget 就要这两个头文件
    #ifndef TETRAHEDRON_H
    #define TETRAHEDRON_H

    #include
    <QtGui/QtGui>
    #include
    <QtOpenGL/QtOpenGL>
    #include
    <QColor>
    #include
    <QPoint>


    class Tetrahedron : public QGLWidget
    {
    Q_OBJECT

    public:
    Tetrahedron(QWidget
    *parent = 0);

    protected:
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);

    private:
    void draw();
    int faceAtPosition(const QPoint &pos);
    GLfloat rotationX;
    GLfloat rotationY;
    GLfloat rotationZ;
    QColor faceColors[
    4];
    QPoint lastPos;
    };


    #endif // TETRAHEDRON_H

    5.修改tetrahedron.cpp代码

    #include <QtGui/QtGui>
    #include
    <QtOpenGL/QtOpenGL>
    #include
    <tetrahedron.h>

    Tetrahedron::Tetrahedron(QWidget
    *parent)
    : QGLWidget(parent)
    {
    setFormat(QGLFormat(QGL::DoubleBuffer
    | QGL::DepthBuffer));
    rotationX
    = -21.0;
    rotationY
    = -57.0;
    rotationZ
    = 0.0;
    faceColors[
    0] = Qt::red;
    faceColors[
    1] = Qt::green;
    faceColors[
    2] = Qt::blue;
    faceColors[
    3] = Qt::yellow;
    }

    void Tetrahedron::initializeGL()
    {
    qglClearColor(Qt::black);
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    }

    void Tetrahedron::resizeGL(int width, int height)
    {
    glViewport(
    0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLfloat x
    = GLfloat(width) / height;
    glFrustum(
    -x, x, -1.0, 1.0, 4.0, 15.0);
    glMatrixMode(GL_MODELVIEW);
    }

    void Tetrahedron::paintGL()
    {
    glClear(GL_COLOR_BUFFER_BIT
    | GL_DEPTH_BUFFER_BIT);
    draw();
    }

    void Tetrahedron::draw()
    {
    static const GLfloat P1[3] = { 0.0, -1.0, +2.0 };
    static const GLfloat P2[3] = { +1.73205081, -1.0, -1.0 };
    static const GLfloat P3[3] = { -1.73205081, -1.0, -1.0 };
    static const GLfloat P4[3] = { 0.0, +2.0, 0.0 };
    static const GLfloat * const coords[4][3] = {
    { P1, P2, P3 }, { P1, P3, P4 }, { P1, P4, P2 }, { P2, P4, P3 }
    };
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(
    0.0, 0.0, -10.0);
    glRotatef(rotationX,
    1.0, 0.0, 0.0);
    glRotatef(rotationY,
    0.0, 1.0, 0.0);
    glRotatef(rotationZ,
    0.0, 0.0, 1.0);
    for (int i = 0; i < 4; ++i) {
    glLoadName(i);
    glBegin(GL_TRIANGLES);
    qglColor(faceColors[i]);
    for (int j = 0; j < 3; ++j) {
    glVertex3f(coords[i][j][
    0], coords[i][j][1],
    coords[i][j][
    2]);
    }
    glEnd();
    }
    }

    void Tetrahedron::mousePressEvent(QMouseEvent *event)
    {
    lastPos
    = event->pos();
    }

    void Tetrahedron::mouseMoveEvent(QMouseEvent *event)
    {
    GLfloat dx
    = GLfloat(event->x() - lastPos.x()) / width();
    GLfloat dy
    = GLfloat(event->y() - lastPos.y()) / height();
    if (event->buttons() & Qt::LeftButton) {
    rotationX
    += 180 * dy;
    rotationY
    += 180 * dx;
    updateGL();
    }
    else if (event->buttons() & Qt::RightButton) {
    rotationX
    += 180 * dy;
    rotationZ
    += 180 * dx;
    updateGL();
    }
    lastPos
    = event->pos();
    }

    void Tetrahedron::mouseDoubleClickEvent(QMouseEvent *event)
    {
    int face = faceAtPosition(event->pos());
    if (face != -1) {
    QColor color
    = QColorDialog::getColor(faceColors[face], this);
    if (color.isValid()) {
    faceColors[face]
    = color;
    updateGL();
    }
    }
    }

    int Tetrahedron::faceAtPosition(const QPoint &pos)
    {
    const int MaxSize = 512;
    GLuint buffer[MaxSize];
    GLint viewport[
    4];
    glGetIntegerv(GL_VIEWPORT, viewport);
    glSelectBuffer(MaxSize, buffer);
    glRenderMode(GL_SELECT);
    glInitNames();
    glPushName(
    0);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluPickMatrix(GLdouble(pos.x()), GLdouble(viewport[
    3] - pos.y()),
    5.0, 5.0, viewport);
    GLfloat x
    = GLfloat(width()) / height();
    glFrustum(
    -x, x, -1.0, 1.0, 4.0, 15.0);
    draw();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    if (!glRenderMode(GL_RENDER))
    return -1;
    return buffer[3];
    }

    代码部分就好了,不过还有一个很重要的地方需要修改

    6.修改.pro文件

    QT += opengl

    这是使用OpenGL需要的地方,之前我估计就是这个东西一直不能成功,哎~~~

  • 相关阅读:
    在IIS上启用Gzip压缩(HTTP压缩)
    跨数据库服务器查询和跨表更新
    GOOGLE高级搜索的秘籍
    NET中的规范标准注释(二) -- 创建帮助文档入门篇
    NET中的规范标准注释(一) -- XML注释标签讲解
    如何取出word文档里的图片
    System帐户!我使用你登陆
    横竖两个数字塔的效果BAT批处理怎么写?
    用批处理修改日期,然后在改回来
    根据日期计算星期几----蔡勒(Zeller)公式推导
  • 原文地址:https://www.cnblogs.com/wangzihao/p/1962384.html
Copyright © 2011-2022 走看看