QGLViewer+Qt5+VS2017开发环境搭建

QGLViewer是在原生OpenGL的基础上做了一层封装,支持显示和交互,而且与QT完美融合,可扩展性好。不足之处是这个库只封装了OpenGL1,其显示速度有待提高。本人在开发环境搭建过程中也踩了不少坑,特此记录,供日后查阅。

准备工作:下载并解压libQGLViewer.zip

下载地址:http://libqglviewer.com/installWindows.html

解压后如图所示:
在这里插入图片描述

一、libGLViewer-2.7.2编译

(1)VS2017+Qt5平台编译

VS ——> Qt VS Tools ——> Open Qt Project File(.pro)——>打开libQGLViewer-2.7.2.pro文件
在这里插入图片描述

(2)编译QGLViewer

选择编译生成Debug或者Release版本的库,我选择了在Release模式下编译(注:Release版本和Debug版本的库不能混用!!!)。
右击QGLViewer——>仅用于项目(J)——>仅生成QGLViewer(B)
骚东西
在这里插入图片描述

如下图所示,当输出目录下生成动态库QGLViewer.dll和静态库QGLViewer.lib时即为编译成功。
在这里插入图片描述

(3)示例代码编译

example文件夹下都是官方给出示例代码,感兴趣的HXD可以编译后跑一把看看效果,我这里就编译运行一下“simpleViewer项目”。
右击simpleViewer项目——>仅用于项目——>仅生成simpleViewer(B)
如下图所示,显示出了一个像老8蜜汁小憨包一样东西,说明QGLViewer库配置成功!
在这里插入图片描述

(4)qglviewerplugin插件的编译和安装

但是上面仅仅是在独立的控制台中利用OpenGL窗口显示了图形,在实际开发过程中实用性并不高。QGLViewer是支持把显示窗口嵌入到QT的QWidget中去使用的,为达到上述效果必须编译安装qglviewerplugin插件。

1)插件编译
右击qglviewerplugin项目——>仅用于项目——>仅生成qglviewerplugin(B)

发生如下错误:qglviewerplugin项目本身编译没问题但是会链接失败,提示无法解析的外部符号。

qglviewerPlugin.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl Viewer::Viewer(class QWidget *)" (__imp_??0Viewer@@QEAA@PEAVQWidget@@@Z),该符号在函数 "public: virtual class QWidget * __cdecl QGLViewerPlugin::createWidget(class QWidget *)" (?createWidget@QGLViewerPlugin@@UEAAPEAVQWidget@@PEAV2@@Z) 中被引用

qglviewerPlugin.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __cdecl Viewer::~Viewer(void)" (__imp_??1Viewer@@UEAA@XZ),该符号在函数 "public: virtual void * __cdecl Viewer::`scalar deleting destructor'(unsigned int)" (??_GViewer@@UEAAPEAXI@Z) 中被引用

qglviewerPlugin.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __cdecl Viewer::draw(void)" (?draw@Viewer@@UEAAXXZ)

解决方法:去源码里面找到这个Viewer类,把Viewer类的“类前宏定义修饰符QDESIGNER_WIDGET_EXPORT”删除掉,再次编译生成即可!
在这里插入图片描述
2)插件安装
将QGLViewer2.dll文件复制到:C:\Windows\System32或者C:\Windows\SysWOW64路径下。
将qglviewerplugin.dll复制到:Qt5安装目录\plugins\designer(在我计算机上路径:C:\OSGeo4W64\apps\Qt5\plugins\designer\)

3)效果
打开QT Designer,左侧控件栏中会出现QGLViewer控件,拖拽到窗体中即可使用。
在这里插入图片描述

(5)库文件提取

其实操作到这里为止,QGLViewer库和控件都已经编译完毕了!但为了今后方便使用,需要新建一个include和lib文件夹,然后把所有h文件统一放到include目录下,把dll文件、lib文件统一放到lib目录下。

如下图所示,在include目录下新建QGLViewer目录和VRender目录,分别把各自头文件扔进去。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

再把QGLViewer.dll、QGLViewer.lib和qglviewerplugin.dll、qglviewerplugin.lib文件扔到lib目录下:
在这里插入图片描述

二、VS工程项目配置

(1)在VS2017中新建一个带窗口的QT项目,切换到Release模式。

(2)包含目录:
Qt5安装目录\include\QTOpenGL (我的路径:C:\OSGeo4W64\apps\Qt5\include\QtOpenGL)
Qt5安装目录\include\QtXml (我的路径:C:\OSGeo4W64\apps\Qt5\include\QtXml)
include文件夹目录 (我的路径:D:\libQGLViewer-2.7.2\include)

(2)库目录:
lib文件夹目录(我的路径:D:\libQGLViewer-2.7.2\lib)
OpenGL32.Lib文件目录(我的路径:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64)

(3)连接器——>输入——>附加依赖项:
QGLViewer2.lib
OpenGL32.Lib

三、代码实现

(1)新建一个QViewer类继承自QGLViewer类,重写相关虚函数。

(2)在Qt Designer中不能直接把QGLViewer控件拖拽到界面上去使用,而是借助于QT自带的QWidget控件,利用代码将OpenGL窗口嵌入到QWidget上来显示图形。

QViewer.h

#include "QGLViewer\qglviewer.h"

class QViewer : public QGLViewer
{
	Q_OBJECT

public:
	QViewer();
	~QViewer();

protected:
    // 重写虚函数draw()和init() 
	virtual void draw();
	virtual void init();

private:
    // 自定义绘图函数(绘制一坨老8蜜汁小憨堡)
	void drawShit();
};

QViewer.cpp

#include "QViewer.h"

QViewer::QViewer()
{
}

QViewer::~QViewer()
{
}

void QViewer::draw()
{
	// 必须在虚函数draw()内部调用自定义的绘图函数才能成功显示图形!!!
	drawShit();
}

void QViewer::init()
{
}

void QViewer::drawShit()
{
	const float nbSteps = 200.0;
	glBegin(GL_QUAD_STRIP);
	for (int i = 0; i < nbSteps; ++i)
	{
		const float ratio = i / nbSteps;
		const float angle = 21.0 * ratio;
		const float c = cos(angle);
		const float s = sin(angle);
		const float r1 = 1.0 - 0.8f * ratio;
		const float r2 = 0.8f - 0.8f * ratio;
		const float alt = ratio - 0.5f;
		const float nor = 0.5f;
		const float up = sqrt(1.0 - nor * nor);
		glColor3f(1.0 - ratio, 0.2f, ratio);
		glNormal3f(nor * c, up, nor * s);
		glVertex3f(r1 * c, alt, r1 * s);
		glVertex3f(r2 * c, alt + 0.05f, r2 * s);
	}
	glEnd();
}

glWidget.cpp

#include "glWidget.h"
#include "QViewer.h"
#include "qgridlayout.h"

glWidget::glWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

	// 关键代码:将OpenGL窗口嵌入到UI上去,自动调用QViewer类的虚函数draw()。
	QViewer* xjm = new QViewer();
	QGridLayout *GridGLLayout = new QGridLayout(this);
	GridGLLayout->addWidget(xjm);
	ui.widget->setLayout(GridGLLayout);
}

最终可以实现下图中的效果:

在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: VS2017和Qt是一种非常流行的开发工具和框架,可以帮助开发者轻松创建各种应用程序。在VS2017中,可以使用C++或其他语言来编写应用程序,同时Qt提供了丰富的UI库和功能模块,可以让开发者更加便捷地创建桌面和移动平台的应用程序。 在Qt方面,Qt Creator是一个非常好用的开发环境,可以让开发者更加轻松地创建和管理项目,在创建新项目时,可以轻松选择模板和添加依赖项。Qt还提供了许多其他的工具和组件,例如Qt Designer可以帮助开发者在不需要编写代码的情况下创建用户界面,Qt Quick用于创建动态的用户界面并将其与C++代码集成到一起。 在实际开发中,VS2017和Qt结合使用可以得到很好的效果。开发者可以使用VS2017来编写C++代码,并通过Qt来创建用户界面和添加功能模块。同时,VS2017也可以通过Qt的插件来支持Qt项目的开发和管理。 总之,VS2017和Qt提供了非常强大的开发工具和框架,可以帮助开发者轻松创建各种应用程序,无论是桌面应用程序还是移动平台应用程序。这两个工具有很好的兼容性和互补性,可以让开发者更加高效地完成项目。 ### 回答2: VS2017是微软公司推出的一款强大的集成开发环境,可用于C++和其他编程语言的开发Qt是一种跨平台的GUI应用程序框架,也可以使用C++编写。 在VS2017中开发Qt应用程序的实践中,我们可以采用Qt插件,让VS2017能够识别和编译Qt代码。安装插件后,我们可以使用VS2017的工具集来创建、管理和构建Qt项目,从而提高开发的效率。 对于初学者来说,使用VS2017开发Qt程序可能会感到有些困难,但是掌握了必要的知识和技能后,我们就能够灵活运用这些工具,轻松地开发出各种功能强大的Qt应用程序。 总之,VS2017提供了许多有用的开发工具,可用于Qt项目的设计、创建和调试,当与Qt框架配合使用时,这些工具可以帮助我们快速、高效地完成开发任务。 ### 回答3: VS2017是一个较为流行的集成开发环境,它提供了强大的工具和功能,可以快速地开发和调试应用程序。而QT则是一个跨平台的GUI应用程序开发框架,它具有良好的可移植性和开发效率。 在使用VS2017进行QT开发实战时,我们可以利用VS2017提供的QT插件来进行QT程序的开发。这样可以大大地减少开发工作量,并加快开发效率。同时,利用VS2017的调试功能也能够快速地发现和解决程序中的问题。 此外,VS2017还支持使用第三方插件进行QT开发,例如:Visual Qt,它是一个免费的插件,支持Windows,Linux,Mac OS X等多种平台。它提供了完整的QT设计器和源码编辑器,使得开发QT程序更加方便和快速。 总的来说,使用VS2017进行QT开发实战可以大大地提高开发效率和程序质量。同时,VS2017也提供了许多便利的工具和功能,使开发更加简单和有趣。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值