libQGLViewer的编译和使用

文章目录

  • libQGLViewer的编译和使用
    • 1 前言
    • 2 libQGLViewer开发环境搭建
      • 2.1 Qt Creator的下载安装
      • 2.2 libQGLViewer的下载编译
      • 2.3 安装Qt Designer 的QGLViewer控件插件(可选)
      • 2.3 关于Qt Designer 的QGLViewer控件插件的一些问题
    • 3 在自己的项目中调用
    • 4 总结

libQGLViewer的编译和使用

1 前言

测试环境:

  • Windows 10
  • Qt Creator
  • libQGLViewer-2.9.1

2 libQGLViewer开发环境搭建

2.1 Qt Creator的下载安装

其实VS也是可以开发的,但是这里我们使用Qt Creator

参考教程:WIndows下搭建Qt开发环境 – Qt 、Qt Creater 安装、配置。

2.2 libQGLViewer的下载编译

源码下载地址:GillesDebunne/libQGLViewer。

http://www.libqglviewer.com 这个网站不知道为啥突然访问不了了,所幸我们可以直接去项目的Github创库下载源码。

image-20230908152617272

这里需要提一下,项目源码分支里的文档(doc文件夹)是不全的,完整的文档把gh-pages分支下载下来,然后把内容合并进doc文件夹。

使用Qt Creator打开libQGLViewer/QGLViewer/QGLViewer.pro加载项目。

然后点击左下角的小榔头,完成构建。构建成功得到两个dll文件:QGLViewer2.dllQGLViewerd2.dll

接下来,将这两个动态库复制到C:\Windows\System32下。完成。

当然,构建过程可不是一帆风顺的(挨了一锤子)。我遇到了如下错误:

去翻阅github仓库的issues,果不其然,有人也遇到了同样的问题(Compiling issues in Qt5.12.12 Ubuntu20.04 · Issue #72)。下面一位大佬给出的解决方案如下:

image-20230908155404294

大概意思是该版本的代码在遇到多屏显示系统时我们需要手动选择一个具体的屏幕。我还特意翻看了2.8.0版本的源码,发现在2.8.0版本中该部分代码未引入QScreen头文件,这也是2.8.0版本不会报这个错误的原因。

根据上面的解决方法,我们修改qglviewer.cppsaveSnapshot.cpp两个源文件中涉及到调用screen()函数的部分:

void QGLViewer::setCamera(Camera *const camera) {if (!camera)return;QScreen *screen = QGuiApplication::primaryScreen();// Disconnect current camera from this viewer.disconnect(this->camera()->frame(), SIGNAL(manipulated()), this,SLOT(update()));disconnect(this->camera()->frame(), SIGNAL(spun()), this, SLOT(update()));//disconnect(screen(), SIGNAL(physicalDotsPerInchChanged(qreal)), this->camera(), SLOT(setDevicePixelRatio(qreal)));disconnect(screen, SIGNAL(physicalDotsPerInchChanged(qreal)), this->camera(), SLOT(setDevicePixelRatio(qreal)));connectAllCameraKFIInterpolatedSignals(false);camera_ = camera;camera->setSceneRadius(sceneRadius());camera->setSceneCenter(sceneCenter());camera->setScreenWidthAndHeight(width(), height());// camera->setDevicePixelRatio(screen()->devicePixelRatio());camera->setDevicePixelRatio(screen->devicePixelRatio());// Connect camera frame to this viewer.connect(camera->frame(), SIGNAL(manipulated()), SLOT(update()));connect(camera->frame(), SIGNAL(spun()), SLOT(update()));// connect(screen(), SIGNAL(physicalDotsPerInchChanged(qreal)), camera, SLOT(setDevicePixelRatio(qreal)));connect(screen, SIGNAL(physicalDotsPerInchChanged(qreal)), camera, SLOT(setDevicePixelRatio(qreal)));connectAllCameraKFIInterpolatedSignals();previousCameraZClippingCoefficient_ = this->camera()->zClippingCoefficient();
}
bool QGLViewer::saveImageSnapshot(const QString &fileName) {static ImageInterface *imageInterface = nullptr;QScreen *screen = QGuiApplication::primaryScreen();//qreal devicePixelRatio = screen()->devicePixelRatio();qreal devicePixelRatio = screen->devicePixelRatio();qreal dipWidth = devicePixelRatio * width();qreal dipHeight = devicePixelRatio * height();...

接下来再次构建就没有问题了。

2.3 安装Qt Designer 的QGLViewer控件插件(可选)

使用Qt Creator打开libQGLViewer/designerPlugin/designerPlugin.pro载入项目,使用小榔头构建项目,注意这里需要切换到release下进行构建

构建完成,在libQGLViewer/build-designerPlugin-Desktop_Qt_5_13_1_MinGW_64_bit-Release/release目录下会生成qglviewerplugin.dll动态库文件。

接下来,将这个动态库文件复制到 $QTDIR\plugins\designer目录下。

然后按照官方教程,还需要把QGLViewer2.dll复制到$QTDir\bin目录下。

接着双击打开$QTDir\bin目录下的designer.exe程序进入Qt Designer界面。发现插件安装成功。

2.3 关于Qt Designer 的QGLViewer控件插件的一些问题

上面安装的插件只能在$QTDir\bin目录下的designer.exe程序中才能使用,也就是说无法在Qt Creator内的designer中使用。

具体原因参见:https://blog.csdn.net/weixin_43207311/article/details/121704484。

解决方法大致就是:从Qt Creator的帮助”About Qt Creator"中查看自己的版本,只需要把对应版本的插件库复到“xxx\Tools\QtCreator\bin\plugins\designer”下,再刷新一下就ok了。

因为查到是MSVC 2017, 32 bit编译的,而我编译器只安装了MinGW64,所以就麻烦自己一点,难得搞了。

3 在自己的项目中调用

按道理来说,现在我们使用Qt Creator随便打开libQGLViewer/examples目录下的示例项目中的.pro,加载示例,然后都可以完美运行看到效果。

但是现在我们想新建一个项目,并将libQGLViewer作为第三方库导入我们自己的项目。

首先,为了方便管理库文件,我们先在libQGLViewer目录下新建includelib文件夹。整理完成后,两个文件夹的结构如下:

├─include
│  └─QGLViewer
│      │  camera.cpp
│      │  camera.h
│      │  config.h
│      │  constraint.cpp
│      │  constraint.h
│      │  domUtils.h
│      │  frame.cpp
│      │  frame.h
│      │  keyFrameInterpolator.cpp
│      │  keyFrameInterpolator.h
│      │  manipulatedCameraFrame.cpp
│      │  manipulatedCameraFrame.h
│      │  manipulatedFrame.cpp
│      │  manipulatedFrame.h
│      │  mouseGrabber.cpp
│      │  mouseGrabber.h
│      │  qglviewer.cpp
│      │  qglviewer.h
│      │  quaternion.cpp
│      │  quaternion.h
│      │  saveSnapshot.cpp
│      │  vec.cpp
│      │  vec.h
│      │
│      └─VRender
│              AxisAlignedBox.h
│              BackFaceCullingOptimizer.cpp
│              BSPSortMethod.cpp
│              EPSExporter.cpp
│              Exporter.cpp
│              Exporter.h
│              FIGExporter.cpp
│              gpc.cpp
│              gpc.h
│              NVector3.cpp
│              NVector3.h
│              Optimizer.h
│              ParserGL.cpp
│              ParserGL.h
│              Primitive.cpp
│              Primitive.h
│              PrimitivePositioning.cpp
│              PrimitivePositioning.h
│              SortMethod.h
│              TopologicalSortMethod.cpp
│              Types.h
│              Vector2.cpp
│              Vector2.h
│              Vector3.cpp
│              Vector3.h
│              VisibilityOptimizer.cpp
│              VRender.cpp
│              VRender.h
│
└─liblibQGLViewer2.alibQGLViewerd2.aQGLViewer2.dllQGLViewerd2.dll

我们了方便测试,我们直接复制libQGLViewer/examples/drawLight文件夹到随便一个路径,然后使用Creator打开其中的.pro加载项目。这时我们直接运行肯定会报错,接下来我们修改drawLight.pro文件:

TEMPLATE = app
TARGET   = drawLight
QT *= xml opengl widgets gui
CONFIG += qt opengl thread# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGSINCLUDEPATH += G:/MSTIFIY/local/libQGLViewer/include # 修改为include文件夹路径LIB_DIR = G:/MSTIFIY/local/libQGLViewer/lib # 修改为lib文件夹路径
win32 {# Seems to be needed for Visual Studio with Intel compilerDEFINES *= WIN32# Use native OpenGL drivers with Qt5.5# No longer implicit since the ANGLE driver is now an alternativeLIBS += -lopengl32 -lglu32isEmpty( QGLVIEWER_STATIC ) {CONFIG(debug, debug|release) {LIBS *= -L$${LIB_DIR} -lQGLViewerd2} else {LIBS *= -L$${LIB_DIR} -lQGLViewer2}} else {DEFINES *= QGLVIEWER_STATICCONFIG(debug, debug|release) {LIBS *= $${LIB_DIR}/libQGLViewerd2.a} else {LIBS *= $${LIB_DIR}/libQGLViewer2.a}}
}HEADERS  = drawLight.h
SOURCES  = drawLight.cpp main.cpp

记得修改INCLUDEPATLIB_DIR两个变量。

这时,点击运行,出现如下结果,运行成功!

4 总结

昨天捣鼓了一白天,头都大了,晚上回去23:00倒头就睡。今早清醒后,换了台电脑从头再来,果然成功了,还是挺有成就感的。呜呜呜,配环境真是一件麻烦的事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/103027.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

功能定义-紧急制动系统

功能简介 紧急制动系统的触发过程如上图所示: 安全距离报警:当两车距离较近时,会给予驾驶员相应提示 预报警:当两车存在碰撞风险但风险较低【Danger Level1】时,会给予驾驶员提示【提示相比之前更为明显】 制动预填充&…

Leetcode 2431.最小偶倍数

给你一个正整数 n ,返回 2 和 n 的最小公倍数(正整数)。 示例 1: 输入:n 5 输出:10 解释:5 和 2 的最小公倍数是 10 。示例 2: 输入:n 6 输出:6 解释&#…

Allegro引流方式有哪些?Allegro平台注意事项

正确的引流,你的平台才会让更多人发现,才能提高转化率,那么Allegro引流方式有哪些,Allegro平台注意事项是什么呢? Allegro引流方式有哪些 商品优化:在Allegro上,关键是确保您的商品能够在搜索…

[SpringBoot3]博客管理系统(源码放评论区了)

八、博客管理系统 创建新的SpringBoot项目,综合运用以上知识点,做一个文章管理的后台应用。依赖: Spring WebLombokThymeleafMyBatis FrameworkMySQL DriverBean Validationhutool 需求:文章管理工作,发布新文章&…

基于googlenet网络的动物种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................. % 获取输入层的尺寸 Inp…

【Golang】函数篇

1、golang函数基本定义与使用 func 函数名 (形参列表) (返回值类型列表) {函数体return 返回值列表 }其中func用于表明这是一个函数,剩下的东西与其他语言的函数基本一致,在定义与使用的时候注意函数名、参数、返回值书写的位置即可。下面使用一个例子…

java开发之个人微信的二次开发

简要描述: 获取收藏详细信息 请求URL: http://域名地址/weChatFavorites/getFavItem 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数:…

算法通关村——滑动窗口高频问题

1. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 1.1 滑动窗口 找到最长字串需要找到字串的首尾位置…

win10系统配置vmware网络NAT模式

1,查看win10 IP地址:ipconfig 2, vmware设置:编辑>>虚拟网络编辑器>>点击添加网络(选择NAT模式) 3,虚拟机网络设置:点击VMware虚拟机>>设置>>网络适配器 4&#xff…

一加11/Ace2/10Pro手机如何实现全局120HZ高刷-游戏超级流畅效果

已经成功root啦。安卓13目前也一样支持LSPosed框架,如果你对LSP框架有需求,也可以使 自测120HZ刷新率诞生以后,很多小伙伴用上了就很难回来啦,一加11/Ace2/10Pro/9pro手 机厂商也对新机做了很多的适配,让我们日常使用起…

智能机器人:打造自动化未来的关键技术

文章目录 1. 智能机器人的基本概念2. 智能机器人的关键技术2.1 机器视觉2.2 机器学习与深度学习2.3 传感器技术 3. 智能机器人的应用领域3.1 制造业3.2 医疗保健3.3 农业3.4 服务业 4. 智能机器人的未来趋势4.1 自主决策能力的提升4.2 协作与互操作性4.3 个性化定制4.4 环境感知…

学习心得07:C#

之前也没有看过C#的书,C#的程序倒是搞了一些。好在项目不大,我又会套路。 C#很象是JAVA。好像就是JAVA出来之后,微软抄的。好东西就要学习,这不丢脸。 我倒是想,有没有办法把JAVA和C#进行映射,然后直接编译…