Cloudcompare 界面解读与界面修改

2023-11-10 00:10

本文主要是介绍Cloudcompare 界面解读与界面修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Cloudcompare 界面解读与界面修改

  • 引言
  • 一、创建主窗体
    • 0. 读取全局配置
    • 1. 启动画面
    • 2. 主界面-mainWindow
  • 二、插件初始化
  • 三、界面修改
    • 3.1 源码修改
    • 3.2 问题总结
  • 四、参考博文

引言

Cloudcompare功能强大,界面让人看着眼花缭乱,但是我们往往只需要部分功能,故尝试对界面进行简化和修改。

一、创建主窗体

0. 读取全局配置

首先读取在上次运行过程中的一些配置,比如界面的样式等等

    //restore some global parameters{QSettings settings;settings.beginGroup(ccPS::GlobalShift());...... //省略

1. 启动画面

跳过一些不常用代码,直接看splash screen部分

    QScopedPointer<QSplashScreen> splash(nullptr); // 创建QSplashScreenQTimer splashTimer;    // 倒计时 主界面启动之后会用到 关闭启动画面...//省略一些代码//splash screenQPixmap pixmap(QString::fromUtf8(":/CC/images/imLogoV2Qt.png"));     // 启动画面在这里修改splash.reset(new QSplashScreen(pixmap, Qt::WindowStaysOnTopHint));splash->show();QApplication::processEvents();

2. 主界面-mainWindow

主界面创建

	MainWindow* mainWindow = MainWindow::TheInstance();   // 主界面mainWindow->initPlugins();                            // 插件mainWindow->show();QApplication::processEvents();

构造函数部分代码

	setWindowTitle(QStringLiteral("窗口标题"));  // 设置窗口标题...//省略一些代码//MDI Area    存放3D view窗口的窗口 //之后创建好的3D view 都会加入到这个窗口  m_mdiArea->addSubWindow(viewWidget);{m_mdiArea = new QMdiArea(this);setCentralWidget(m_mdiArea);connect(m_mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::updateMenus);connect(m_mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::on3DViewActivated);m_mdiArea->installEventFilter(this);}

new3DView 显示点云的界面,底层使用openGL

	QWidget* viewWidget = nullptr;ccGLWindow* view3D = nullptr;createGLWindow(view3D, viewWidget);   // 创建m_mdiArea->addSubWindow(viewWidget);  // 加入到m_mdiArea窗口...//省略一些代码view3D->setSceneDB(m_ccRoot->getRootEntity());

需要注意的是view3D的SceneDB绑定的是m_ccRoot->getRootEntity(),不太理解
故看其函数,传递的参数类型为ccHObject,尝试传递其他继承ccHObject的类亦可正常显示,比如:ccPointCloud (绑定读取后的点云数据)

void ccGLWindow::setSceneDB(ccHObject* root)  // 看源码,ccGLWindow里实现了基于这个SceneDB的三维可视化代码
// 存在两个DB m_globalDBRoot (全局DB) 和 m_winDBRoot (GL window own DB)

还有一些界面控件,没有在构造函数中创建,而是在ui文件中创建,更多细节可以通过Qt Designer打开mainWindow.ui查看

二、插件初始化

在mainWindow显示之前会进行插件初始化

	mainWindow->initPlugins();mainWindow->show();

核心就是将插件的工具栏显示加入到主界面上,把插件action加入到工具栏中

void MainWindow::initPlugins( )
{m_pluginUIManager->init();  // 插件初始化 // Set up dynamic tool barsaddToolBar( Qt::RightToolBarArea, m_pluginUIManager->glFiltersToolbar() );addToolBar( Qt::RightToolBarArea, m_pluginUIManager->mainPluginToolbar() );for ( QToolBar *toolbar : m_pluginUIManager->additionalPluginToolbars() ){addToolBar( Qt::TopToolBarArea, toolbar );}...//省略将插件添加到菜单栏

使用插件式开发还是蛮方便的,详情可以看我的Cloudcompare 标准插件初探(MyPlugin)

三、界面修改

大致的了解Cloudcompare 的界面,下面进行适当修改(程序图标修改1
小建议:不要轻易尝试移植代码,CloudCompare很多都是高耦合低内聚的

引用一段深有同感的话:移植CC相关功能时就想简单粗暴把它整个代码复制黏贴过来,然后各种改,缺什么给它补什么,其实最后你会发现,你就差把整个CC的平台都移植过来了2:点云平台之cloudCompare开发三

3.1 源码修改

main.cpp修改

	//mainWindow->initPlugins();     // 取消插件初始化mainWindow->show();mainWindow->change_UI();         // 对界面进行修改QApplication::processEvents();

在mainwindow.h的添加

public:// 自定义QAction *MyAciton;QToolBar *MyToolBar;void change_UI();     // 这个是主要的 以上两次测试使用

在mainwindow.cpp的添加

setWindowTitle(QStringLiteral("哈哈 ^_^ "));   // 构造函数中修改了窗口标题
void MainWindow::change_UI()
{// 0.隐藏m_UI->toolBarView->setVisible(false);       // 左侧工具栏m_UI->toolBarMainTools->setVisible(false);  // 上方工具栏m_UI->toolBarSFTools->setVisible(false);    // 上方工具栏 (右侧)...//省略一些代码

显示如下 主要隐藏了工具栏
在这里插入图片描述 —> 在这里插入图片描述

3.2 问题总结

为什么要在show之后增加mainWindow->change_UI()

  • cpp构造函数中修改mainwindow.ui中的控件无效 比如使用hide(),但主界面show之后还是显示了,并没有隐藏3
  • 尽量不修改源码,方便版本迭代维护

四、参考博文


  1. CloudCompare 二次开发注意事项 ↩︎

  2. 点云平台之cloudCompare开发三 ↩︎

  3. 对setVisible(false)的调用在QWidget的构造函数中不起作用 ↩︎

这篇关于Cloudcompare 界面解读与界面修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/379272

相关文章

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

如何在运行时修改serialVersionUID

优质博文:IT-BLOG-CN 问题 我正在使用第三方库连接到外部系统,一切运行正常,但突然出现序列化错误 java.io.InvalidClassException: com.essbase.api.base.EssException; local class incompatible: stream classdesc serialVersionUID = 90314637791991

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互