功能:qt+opengl 实现独立显示一个点
注意:
openglWidget类在添加时候,要设置成QT->设计师类,勾选widget
把MainWindow中的widget 提升为 openglwidget类
mainwindow.h 代码如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <openglwidget.h>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp 代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
openglWidget.h代码如下:
#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H
#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
class QOpenGLShaderProgram;
namespace Ui {
class OpenGLWidget;
}
class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
explicit OpenGLWidget(QWidget *parent = 0);
~OpenGLWidget();
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
private:
Ui::OpenGLWidget *ui;
QOpenGLShaderProgram *program;
};
#endif // OPENGLWIDGET_H
openglwidget.cpp代码如下:
#include "openglwidget.h"
#include "ui_openglwidget.h"
OpenGLWidget::OpenGLWidget(QWidget *parent) :
QOpenGLWidget(parent),
ui(new Ui::OpenGLWidget)
{
ui->setupUi(this);
}
OpenGLWidget::~OpenGLWidget()
{
delete ui;
}
void OpenGLWidget::initializeGL()
{
//调用内容初始化函数
initializeOpenGLFunctions();
// 创建顶点着色器
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
const char *vsrc =
"void main() { \n"
" gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n"
"} \n";
vshader->compileSourceCode(vsrc);
// 创建片段着色器
QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
const char *fsrc =
"void main() { \n"
" gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
"} \n";
fshader->compileSourceCode(fsrc);
// 创建着色器程序
program = new QOpenGLShaderProgram;
program->addShader(vshader);
program->addShader(fshader);
program->link();
program->bind();
}
void OpenGLWidget::resizeGL(int w, int h)
{
//当窗口大小改变时,调整界面坐标显示高度和宽度
glViewport(0, 0, w, h);
}
void OpenGLWidget::paintGL()
{
//清除之前图形并将背景设置为黑色(设置为黑色纯粹个人爱好!)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// 绘制
glDrawArrays(GL_POINTS, 0, 1);
}
main.cpp 代码如下:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}