基于Qt绘制OpenGL界面的解决方案
效果:
方法:定义一个OpenGL的类(GLWidget),在主界面(Mapper)相关函数中调用 (也可在本人博客下载资源中获取完整项目文件)
(GLWidget.h)
#pragma once
#pragma once
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QtWidgets/QMainWindow>
#include<qopenglfunctions.h>
#include<gl/glut.h>
#include<QtOpenGL/qgl.h>
#include<qopenglwidget.h>
#include<gl/GLU.h>
#include <QtGui>
#include <QtCore>
#include<QOpenGLWidget>
#include<QOpenGLFunctions>
#include<QEvent>
#include<qmessagebox.h>
#define LEFT_EDGE 1
#define RIGHT_EDGE 2
#define BOTTOM_EDGE 4
#define TOP_EDGE 8
class GLWidget : public QGLWidget//,Edge,Point
{
Q_OBJECT
public:
GLWidget(QWidget *parent = Q_NULLPTR);
void InitGL();//初始化
void reshape(int w, int h);//更改形状
void paintGL();//绘制
protected:
private:
public slots://信号槽
};
#endif // GLWIDGET_H
(GLWidget.cpp)
#include "GLWidget.h"
#include<gl/GL.h>
#include<gl/GLU.h>
#include<GL/glut.h>
#include <QTimer>
GLWidget::GLWidget(QWidget *parent) :
QGLWidget(parent)
{
}
void GLWidget::InitGL()
{
initializeGL();
}
void GLWidget::reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-100, 100, -100, 100);
glViewport(300, -90, 900, 900);
glColor3f(0.2, 0.8, 0.2);
glBegin(GL_LINES);
glVertex3f(-800.0f, 0.0f, 0.0f);
glVertex3f(800.0f, 0.0f, 0.0f);
glEnd();
glBegin(GL_LINES);
glVertex3f(0.0f, 800.0f, 0.0f);
glVertex3f(0.0f, -800.0f, 0.0f);
glEnd();
}
项目文件(.h)
#pragma once
#include <QtWidgets/QMainWindow>
#include "GLWidget.h"
#include<Windows.h>
#include<GL/GL.h>
#include<GL/GLU.h>
#include <QMainWindow>
#include <QtOpenGL>
#include <QAction>
#include <QLabel>
#include <QMenu>
#include <QSlider>
#include <QScrollArea>
#include <QMenuBar>
#include <QApplication>
#include <QSlider>
#include <QTimer>
class Mapper : public QMainWindow
{
Q_OBJECT
public:
Mapper(QWidget *parent = Q_NULLPTR);
GLWidget glClass;
void mousePressEvent(QMouseEvent * event);//鼠标按下
void mouseReleaseEvent(QMouseEvent *event);//鼠标松开
public slots:
void aboutUs();//介绍
void drawFigure();//“绘制图形”界面设计
void showLine();//连接Opengl(GLWidget) 进行绘制
private:
void createMenus();//菜单栏
void createActions();//菜单子任务栏
//菜单
QMenu *funcMenu;
QMenu *helpMenu;
//opengl窗口控件
QWidget *centralWidget;
QScrollArea *glWidgetArea;
GLWidget *glWidget;
//Action命令
QAction *exitAction;
QAction *aboutAction;
QAction *aboutQtAction;
QAction *drawAction;
//按钮
QPushButton *drawLine;
//下拉框
QComboBox *chooseLine;
};
项目文件(.cpp)
#include "Mapper.h"
Mapper::Mapper(QWidget *parent)
: QMainWindow(parent)
{
centralWidget = new QWidget;
setCentralWidget(centralWidget);
setWindowTitle(tr("Painter"));
resize(2000, 1500);
glWidget = new GLWidget;
glWidgetArea = new QScrollArea;
glWidgetArea->setWidget(glWidget);
//glWidgetArea->viewport()->setBackgroundRole(QPalette::Dark);
glWidgetArea->setWidgetResizable(true);
glWidgetArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
glWidgetArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
glWidgetArea->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
createActions();
createMenus();
}
void Mapper::mousePressEvent(QMouseEvent * event)
{
}
void Mapper::mouseReleaseEvent(QMouseEvent * event)
{
}
//创建菜单栏
void Mapper::createMenus()
{
helpMenu = menuBar()->addMenu(QString::fromLocal8Bit("&帮助"));
funcMenu = menuBar()->addMenu(QString::fromLocal8Bit("&功能"));
helpMenu->addAction(aboutAction);
helpMenu->addAction(aboutQtAction);
helpMenu->addAction(exitAction);
funcMenu->addAction(drawAction);
}
//菜单栏子命令
void Mapper::createActions()
{
aboutAction = new QAction(tr("&About us"), this);
connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutUs()));
aboutQtAction = new QAction(tr("About &Qt"), this);
connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
exitAction = new QAction(tr("E&xit"), this);
connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
drawAction = new QAction(QString::fromLocal8Bit("&绘制图形"), this);
connect(drawAction, SIGNAL(triggered()), this, SLOT(drawFigure()));
}
void Mapper::aboutUs()
{
QMessageBox::about(this, tr("About Mapper"),tr("Hi~~ The <b>Mapper</b> is based on the Qt and OpenGL. "));
}
void Mapper::drawFigure()
{
//新建声明
drawLine = new QPushButton(QString::fromLocal8Bit("画线"));
chooseLine = new QComboBox;
chooseLine->addItem(QString::fromLocal8Bit("中点画线"));
chooseLine->addItem(QString::fromLocal8Bit("Bresenham画线"));
//界面设计布控
QGridLayout *centralLayout = new QGridLayout;
centralLayout->addWidget(glWidgetArea, 0, 0, 6, 6);
centralLayout->addWidget(chooseLine, 0, 6, 1, 1);
centralLayout->addWidget(drawLine, 1, 6, 1, 1);
centralWidget->setLayout(centralLayout);
connect(drawLine, &QPushButton::clicked, this, &Mapper::showLine);
}
//显示 联机OpenGL
void Mapper::showLine()
{
glWidget->updateGL();
}