基于Qt绘制OpenGL界面的解决方案

基于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();
}

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值