ubuntu+QT+ OpenGL环境搭建和绘图

一,安装OpenGL库

安装OpenGL依赖项:运行sudo apt install libgl1-mesa-glx命令安装OpenGL所需的一些依赖项。

安装OpenGL头文件:运行sudo apt install libgl1-mesa-dev命令来安装OpenGL的头文件。

安装GLUT库:GLUT(OpenGL Utility Toolkit)是一个方便的库,提供了用于创建OpenGL应用程序的实用工具函数。运行sudo apt install freeglut3-dev命令来安装GLUT库。

安装GLEW库:GLEW(OpenGL Extension Wrangler)是一个库,提供了方便的函数和宏,用于在OpenGL应用程序中访问扩展和函数。运行sudo apt install libglew-dev命令来安装GLEW库。

编译和链接OpenGL程序:写完OpenGL程序,你g++ application.cpp -o application `pkg-config --cflags --libs opengl`使用以下命令来编译和链接。

二,新建qt下openGL工程

需要在.pro文件中添加QT += opengl

glwidget.h

复制代码
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include<QtOpenGL>
#include<QWidget>
namespace Ui{
class GLWidget;
}
class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit GLWidget(QGLWidget *parent = 0);
    ~GLWidget();
protected:
    void initializeGL();  //初始化OpenGL窗口部件
    void paintGL();  //绘制整个OpenGL窗口,只要有更新发生,这个函数就会被调用
    void resizeGL(int width,int height); //处理窗口大小变化事件的,参数是新状态下的宽和高
    void keyPressEvent(QKeyEvent *e);  //鼠标处理函数
protected:
    bool fullscreen;  //判断是否全屏的变量
private:
    Ui::GLWidget *ui;
};
#endif // GLWIDGET_H

glwidget.cpp

复制代码
#include"glwidget.h"
#include"ui_glwidget.h"
#include<QtGui>
#include<QtCore>
#include<QtOpenGL>



GLWidget::GLWidget(QGLWidget *parent) :QGLWidget(parent),ui(new Ui::GLWidget)
{
    ui->setupUi(this);
    fullscreen = false;
}

//这是对虚函数,这里是重写该函数

void GLWidget::initializeGL()
{

    setGeometry(300, 200, 640,480);//设置窗口初始位置和大小

    glShadeModel(GL_FLAT);//设置阴影平滑模式

    glClearColor(0.0, 0.0,0.0, 0);//改变窗口的背景颜色

    glClearDepth(1.0);//设置深度缓存

    glEnable(GL_DEPTH_TEST);//允许深度测试

    glDepthFunc(GL_LEQUAL);//设置深度测试类型

    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//进行透视校正

}



void GLWidget::paintGL()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glLoadIdentity();
    //renderText(10,20,"Hello,My Dear");

    // glColor3f(1.0, 0.0,0.0);
    /*
        glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 1.0,0.0);
        glVertex3f(-1.0, -1.0,0.0);
        glVertex3f(1.0, -1.0,0.0);
        glEnd();*/

    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f,0.0f);
    glVertex3f(0.0f,1.0f, 0.0f);
    glColor3f(0.0f, 1.0f,0.0f);
    glVertex3f(-1.0f,-1.0f, 0.0f);
    glColor3f(0.0f, 0.0f,1.0f);
    glVertex3f(1.0f,-1.0f, 0.0f);
    glEnd();
    renderText(20, 100,"Hello Jcy, My first OpenGL app.");
}



//该程序是设置opengl场景透视图,程序中至少被执行一次(程序启动时).

void GLWidget::resizeGL(int width, int height)
{
    if(0 == height)
    height = 1;//防止一条边为0
    glViewport(0, 0,(GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了
    glMatrixMode(GL_PROJECTION);//选择投影矩阵
    glLoadIdentity();//重置选择好的投影矩阵
    // gluPerspective(45.0,(GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵
    //  glMatirxMode(GL_MODELVIEW);//以下2句和上面出现的解释一样
    glLoadIdentity();
}



void GLWidget::keyPressEvent(QKeyEvent *e)
{
    switch(e->key())
    {
  //F1键为全屏和普通屏显示切换键

    case Qt::Key_F1:
        fullscreen =!fullscreen;
        if(fullscreen)
        showFullScreen();
        else
        {
            setGeometry(300, 150, 640, 480);
            showNormal();
        }

        updateGL();
        break;
        //Ese为退出程序键
    case Qt::Key_Escape:
        close();
    }

}

GLWidget::~GLWidget()
{
    delete ui;
}

运行效果

相关推荐
大柏怎么被偷了16 分钟前
【Linux】进程等待
linux·运维·服务器
偶像你挑的噻1 小时前
12-Linux驱动开发- SPI子系统
linux·驱动开发·stm32·嵌入式硬件
松涛和鸣2 小时前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法
念风2 小时前
[lvgl]如何优雅地向lv_port_linux中添加tslib支持
linux
自由的好好干活3 小时前
使用Qoder编写ztdaq的C#跨平台示例总结
linux·windows·c#·qoder
赖small强3 小时前
【Linux 网络基础】libwebsockets HTTPS 服务端实现机制详解
linux·网络·https·tls·libwebsockets
optimistic_chen4 小时前
【Redis 系列】Redis详解
linux·数据库·redis·缓存·xsheel
低客的黑调4 小时前
了解JVM 结构和运行机制,从小白编程Java 大佬
java·linux·开发语言
想唱rap4 小时前
C++ map和set
linux·运维·服务器·开发语言·c++·算法
CodeByV4 小时前
【Linux】Ext 系列文件系统深度解析:从磁盘到软硬链接
linux·服务器