当前位置: 首页 > news >正文

基于Qt的osg读取模型进度回调

目前测试只支持按流的方式读取的模型文件比如*.ive,*.fbx测试不可用,代码留给有需要的人。

#ifndef ReadFileCB_h__
#define ReadFileCB_h__#include <osgDB/Registry>
#include <QObject>class CReadFileCB : public QObject, public osgDB::Registry::ReadFileCallback
{Q_OBJECTpublic:CReadFileCB();virtual ~CReadFileCB(){}void AttachFile(const std::string& strFilePath);osgDB::ReaderWriter::ReadResult readNode(const std::string& filename, const osgDB::Options* options) override;signals:void SigStart();void SigFinish();void SigCurrentProgress(int nCur);private:void Start();void Finish();void SetCurrentProgress(int nCur);private:friend class CReadingThread;std::string m_strFilePath;
};#endif // ReadFileCB_h__
#include "ReadFileCB.h"
#include "ReadFileProgressBar.h"
#include "ReadingThread.h"#include <osgDB/FileNameUtils>
#include <osgDB/FileUtils>CReadFileCB::CReadFileCB()
{}void CReadFileCB::AttachFile(const std::string& strFilePath)
{m_strFilePath = strFilePath;
}osgDB::ReaderWriter::ReadResult CReadFileCB::readNode(const std::string& filename, const osgDB::Options* options)
{if (m_strFilePath != filename){return osgDB::ReaderWriter::ReadResult::FILE_NOT_HANDLED;}std::string dtrExt = osgDB::getLowerCaseFileExtension(filename);osgDB::ReaderWriter* rw = osgDB::Registry::instance()->getReaderWriterForExtension(dtrExt);if (NULL != rw){return osgDB::ReaderWriter::ReadResult::FILE_NOT_HANDLED;}std::string strFileName = osgDB::findDataFile(filename, options);if (strFileName.empty()){return osgDB::ReaderWriter::ReadResult::FILE_NOT_FOUND;}osgDB::ifstream fin(strFileName.c_str(), std::ios::in | std::ios::binary);if (!fin.is_open()){return osgDB::ReaderWriter::ReadResult::ERROR_IN_READING_FILE;}CReadingThread crt(this, &fin);crt.start();bool bIsGood = fin.good();if (bIsGood){std::cout << "Using default format readerwriter" << std::endl;osgDB::ReaderWriter::ReadResult rr = rw->readNode(fin);QEventLoop loop;connect(&crt, &CReadingThread::finished, &loop, &QEventLoop::quit);loop.exec();return rr;}else{return osgDB::ReaderWriter::ReadResult::ERROR_IN_READING_FILE;}
}void CReadFileCB::Start()
{emit SigStart();
}void CReadFileCB::Finish()
{emit SigFinish();
}void CReadFileCB::SetCurrentProgress(int nCur)
{CReadFileProgressBar* p = CReadFileProgressBar::Instance();if (NULL != p){p->SetValue(nCur);}//emit SigCurrentProgress(nCur);
}
#ifndef ReadingThread_h__
#define ReadingThread_h__#include <osgDB/fstream>#include <QThread>class CReadFileCB;
class CReadingThread : public QThread
{
public:CReadingThread(CReadFileCB* pReadFileCB, osgDB::ifstream* fin);virtual ~CReadingThread(){}protected:void run() override;protected:CReadFileCB* m_pReadFileCB;osgDB::ifstream* m_pFin;double m_dLength;
};#endif // ReadingThread_h__
#include "ReadingThread.h"
#include "ReadFileCB.h"CReadingThread::CReadingThread(CReadFileCB* pReadFileCB, osgDB::ifstream* fin): m_pReadFileCB(pReadFileCB), m_pFin(fin), m_dLength(0)
{if (NULL != fin && fin->is_open()){fin->seekg(0, std::ifstream::end);m_dLength = fin->tellg();fin->seekg(0, std::ifstream::beg);}else{std::cerr << "Error: File not opened correctly." << std::endl;}
}void CReadingThread::run()
{if (NULL == m_pFin || !m_pFin->is_open()){std::cerr << "Error: File stream is not open." << std::endl;return;}m_pReadFileCB->Start();double dPos = m_pFin->tellg();while (dPos < m_dLength){dPos = m_pFin->tellg();if (dPos == -1){dPos = m_dLength;}// 回调进度if (NULL != m_pReadFileCB){int nCur = static_cast<int>(dPos / m_dLength * 100);m_pReadFileCB->SetCurrentProgress(nCur);}std::cout << 100.0 * dPos / m_dLength << "%" << std::endl;}m_pReadFileCB->Finish();
}
#ifndef ReadFileProgressBar_h__
#define ReadFileProgressBar_h__#include <QDialog>
#include <QEventLoop>class CReadFileCB;
QT_BEGIN_NAMESPACE
namespace Ui { class CReadFileProgressBarClass; };
QT_END_NAMESPACE// 目前测试只支持可以以流的形式读入的模型文件
class CReadFileProgressBar : public QDialog
{Q_OBJECTprivate:CReadFileProgressBar(QWidget *parent = nullptr);~CReadFileProgressBar();public:static CReadFileProgressBar* Instance();bool AttachFile(const std::string& strFilePath);void Detach();int Value();int MaxValue();//默认0-100void SetRange(int nMin, int nMax);void SetValue(int nValue);void SetTitle(const QString& strTitle);private slots:void SlotShow();void SlotClose();void SlotSetCurrentValue(int nValue);private:Ui::CReadFileProgressBarClass *ui;CReadFileCB* m_pReadFileCB;
};#endif // ReadFileProgressBar_h__
#include "ReadFileProgressBar.h"
#include "ui_ReadFileProgressBar.h"#include "ReadFileCB.h"CReadFileProgressBar::CReadFileProgressBar(QWidget* parent): QDialog(parent), ui(new Ui::CReadFileProgressBarClass()), m_pReadFileCB(new CReadFileCB)
{ui->setupUi(this);setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏setStyleSheet("QProgressBar{""	font:9pt;""	border-radius:5px;""	text-align:center;""	border:1px solid #E8EDF2;""	background-color: rgb(255, 255, 255);""	border-color: rgb(180, 180, 180);""}""QProgressBar:chunk{""	border-radius:5px;""	background-color:#1aafea;""}");SetRange(0, 100);connect(m_pReadFileCB, &CReadFileCB::SigCurrentProgress, this, &CReadFileProgressBar::SlotSetCurrentValue);connect(m_pReadFileCB, &CReadFileCB::SigStart, this, &CReadFileProgressBar::SlotShow);connect(m_pReadFileCB, &CReadFileCB::SigFinish, this, &CReadFileProgressBar::SlotClose);
}CReadFileProgressBar::~CReadFileProgressBar()
{delete ui;
}CReadFileProgressBar* CReadFileProgressBar::Instance()
{static CReadFileProgressBar customProgressBar();return &customProgressBar;
}bool CReadFileProgressBar::AttachFile(const std::string& strFilePath)
{if (NULL != m_pReadFileCB){m_pReadFileCB->AttachFile(strFilePath);SetTitle(QString(strFilePath.c_str()));osgDB::Registry::instance()->setReadFileCallback(m_pReadFileCB);return true;}std::cerr << "CReadFileProgressBar::AttachFile failed!";return false;
}void CReadFileProgressBar::Detach()
{osgDB::Registry::instance()->setReadFileCallback(nullptr);
}int CReadFileProgressBar::Value()
{return ui->progressBar->value();
}int CReadFileProgressBar::MaxValue()
{return ui->progressBar->maximum();
}void CReadFileProgressBar::SetRange(int nMin, int nMax)
{ui->progressBar->setRange(nMin, nMax);
}void CReadFileProgressBar::SetValue(int nValue)
{ui->progressBar->setValue(nValue);QApplication::processEvents();
}void CReadFileProgressBar::SetTitle(const QString& strTitle)
{ui->label->setText(strTitle);
}void CReadFileProgressBar::SlotShow()
{show();
}void CReadFileProgressBar::SlotClose()
{close();
}void CReadFileProgressBar::SlotSetCurrentValue(int nValue)
{SetValue(nValue);
}

读取模型文件部分代码参考了杨总的博客-第19节 实例-显示模型读取进度。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构:栈(含源码)
  • [QNX] C++编程: 外部硬件加速器与SOC共享内存中使用NOCACHE的必要性与优化策略
  • jQuery实现图片轮播效果
  • Redis相关面试题(二)
  • Go框架选战:Gin、Echo、Fiber的终极较量
  • 力扣 | 递增子序列 | 动态规划 | 最长递增子序列、最长递增子序列的个数、及其变式
  • Python-调用pymysql库,执行插入语句
  • 3个月,从Web前端到鸿蒙应用高手
  • 67、ceph
  • Go语言+Vue3开发前后端后台管理系统实战 用户管理的前端界面和表结构分析
  • MySQl 中对数据表的增删改查(基础)
  • 软件测试下的AI之路(6)
  • Python万字长文基础教程第四章:函数
  • 用openssl 创建自签名证书用于内网HTTPS
  • 云原生与微服务
  • SegmentFault for Android 3.0 发布
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • HTTP 简介
  • interface和setter,getter
  • JS笔记四:作用域、变量(函数)提升
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • SpringBoot几种定时任务的实现方式
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 前端面试之CSS3新特性
  • 区块链共识机制优缺点对比都是什么
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 项目实战-Api的解决方案
  • 小程序开发之路(一)
  • ​第20课 在Android Native开发中加入新的C++类
  • #NOIP 2014# day.2 T2 寻找道路
  • (arch)linux 转换文件编码格式
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (备份) esp32 GPIO
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五)MySQL的备份及恢复
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .apk 成为历史!
  • .apk文件,IIS不支持下载解决
  • .NET 8.0 中有哪些新的变化?
  • .net dataexcel 脚本公式 函数源码
  • .NET 依赖注入和配置系统
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [20190416]完善shared latch测试脚本2.txt
  • [AIGC] SpringBoot的自动配置解析