文章目录

  • Qt&Vtk-Cone2
    • 1 代码搬运
      • 1.1 cone2.h
      • 1.2 cone2.cpp
      • 1.3 官方代码
    • 2 运行效果
    • 3 知识点
      • 3.1 观察者模式
    • ★ 源码 ★

Qt&Vtk-Cone2

今天我们又来搬运代码了,看标题也知道,这个和昨天的那个应该是没有啥区别的,那么我看官方实例的描述的,就是下面的内容。

// This example shows how to add an observer to a C++ program. It extends
// the Step1/Cxx/Cone.cxx C++ example (see that example for information on
// the basic setup).

大致翻译:意思就是演示一下如何在C++中添加一个观察者,项目是扩展的了昨天的那个Cone

官方的效果呢,就是下面这个鬼样子,相比于昨天的样子,就是在cmd窗口中有了数据输出。

1 代码搬运

1.1 cone2.h

#ifndef CONE2_H
#define CONE2_H#include <QWidget>
#include <QTimer>
#include <QDebug>
#include <QString>
#include <QTextBrowser>
#include "QVTKOpenGLWidget.h"               //新版本,旧版QVTKWidget
#include "vtkAutoInit.h"
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkCommand.h"
namespace Ui {
class Cone2;
}
class vtkMyCallback : public vtkCommand
{
public:static vtkMyCallback *New(){return new vtkMyCallback;}void Execute(vtkObject *caller,unsigned long,void*) override;QTextBrowser *textBrowser = nullptr;
private:
};
class Cone2 : public QWidget
{Q_OBJECT
public:explicit Cone2(QWidget *parent = nullptr);~Cone2();void outputMessage(double temp);private:Ui::Cone2 *ui;vtkConeSource *cone = nullptr;                  //声明椎体vtkPolyDataMapper *coneMapper = nullptr;        //声明映射器vtkActor *coneActor = nullptr;                  //声明ActorvtkRenderer *coneRender = nullptr;              //声明渲染器QTimer *rotationTimer = nullptr;                //声明定时器,用于旋转椎体vtkMyCallback *myCallBack = nullptr;
};#endif // CONE2_H

1.2 cone2.cpp

#include "cone2.h"
#include "ui_cone2.h"Cone2::Cone2(QWidget *parent) :QWidget(parent),ui(new Ui::Cone2)
{ui->setupUi(this);cone = vtkConeSource::New();    //新建对象cone->SetHeight(3.0);           //设置高度cone->SetRadius(1.0);           //设置半径cone->SetResolution(10000000);        //翻译为设置分辨率,不过实际应该不是coneMapper = vtkPolyDataMapper::New();          //新建映射器coneMapper->SetInputConnection(cone->GetOutputPort());  //设置Cone输出coneMapper数据输入//新建Actor,并设置映射器coneActor = vtkActor::New();coneActor->SetMapper(coneMapper);//新建渲染器并设置Actor和背景颜色coneRender = vtkRenderer::New();coneRender->AddActor(coneActor);coneRender->SetBackground(0.1,0.2,0.3);myCallBack = vtkMyCallback::New();myCallBack->textBrowser = ui->textBrowser;coneRender->AddObserver(vtkCommand::StartEvent,myCallBack);//获取渲染窗口ui->widget->GetRenderWindow()->AddRenderer(coneRender);//    while (1) {//        ui->widget->GetRenderWindow()->Render();//        coneRender->GetActiveCamera()->Azimuth(1);//    }//旋转椎体rotationTimer = new QTimer();connect(rotationTimer,&QTimer::timeout,this,[=](){coneRender->GetActiveCamera()->Azimuth(1);ui->widget->GetRenderWindow()->Render();            //注意这句话,要加上呀,不然人不给你转,惰性渲染。});rotationTimer->start(25);
}Cone2::~Cone2()
{rotationTimer->stop();delete ui;
}
void vtkMyCallback::Execute(vtkObject *caller, unsigned long, void *)
{vtkRenderer *renderer = reinterpret_cast<vtkRenderer*>(caller);textBrowser->append("Camera Position:");textBrowser->append(QString::number((renderer->GetActiveCamera()->GetPosition()[0]),'g',6));textBrowser->append(QString::number((renderer->GetActiveCamera()->GetPosition()[1]),'g',6));textBrowser->append(QString::number((renderer->GetActiveCamera()->GetPosition()[2]),'g',6));
}

1.3 官方代码

#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCommand.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"// Callback for the interaction
class vtkMyCallback : public vtkCommand
{
public:static vtkMyCallback *New(){ return new vtkMyCallback; }void Execute(vtkObject *caller, unsigned long, void*) override{vtkRenderer *renderer = reinterpret_cast<vtkRenderer*>(caller);cout << renderer->GetActiveCamera()->GetPosition()[0] << " "<< renderer->GetActiveCamera()->GetPosition()[1] << " "<< renderer->GetActiveCamera()->GetPosition()[2] << "\n";}
};int main()
{//// The pipeline creation is documented in Step1//vtkConeSource *cone = vtkConeSource::New();cone->SetHeight( 3.0 );cone->SetRadius( 1.0 );cone->SetResolution( 10 );vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();coneMapper->SetInputConnection( cone->GetOutputPort() );vtkActor *coneActor = vtkActor::New();coneActor->SetMapper( coneMapper );vtkRenderer *ren1= vtkRenderer::New();ren1->AddActor( coneActor );ren1->SetBackground( 0.1, 0.2, 0.4 );ren1->ResetCamera();vtkRenderWindow *renWin = vtkRenderWindow::New();renWin->AddRenderer( ren1 );renWin->SetSize( 300, 300 );// Here is where we setup the observer, we do a new and ren1 will// eventually free the observervtkMyCallback *mo1 = vtkMyCallback::New();ren1->AddObserver(vtkCommand::StartEvent,mo1);mo1->Delete();//// now we loop over 360 degrees and render the cone each time//int i;for (i = 0; i < 360; ++i){// render the imagerenWin->Render();// rotate the active camera by one degreeren1->GetActiveCamera()->Azimuth( 1 );}//// Free up any objects we created//cone->Delete();coneMapper->Delete();coneActor->Delete();ren1->Delete();renWin->Delete();return 0;
}

2 运行效果

在第1.3 中之所以贴出了官方的代码,就是为了让大家看下原生的内容,我这里做了改动,就是把他的输出信息显示到我界面的一个TextBrowser中了。

3 知识点

3.1 观察者模式

参考资料:https://zhuanlan.zhihu.com/p/119308881

​ https://blog.csdn.net/hyongilfmmm/article/details/83015045?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control

引用资料中的一句话观察者模式的核心思想就是一对多

看到这里,是不是感觉和Qt 的信号槽好像呀,Qt的信号槽就是观察者模式的一种实现。

★ 源码 ★

这里就要有人问了呀,这么优秀的代码,能不能分享下呀,当然可以呀,我不生产代码,我只是代码的搬运工,链接如下:

自取:https://github.com/DreamLife-Jianwei/Qt-Vtk


QtVtk-007-Cone2相关推荐

  1. “996 是福利,007 才是常态”?!千万程序员怒怼每日优鲜!

    呔!热度不是你想蹭,想蹭就能蹭-- 作者 | 仲培艺 封图 | CSDN 付费下载自东方IC 出品 | 程序人生(ID:coder_life) App Store 评分一日之间从 4.5 断崖直降至 ...

  2. 机器人替代研究员,工作007,完成688次实验,登上Nature封面

    点击上方"视学算法",选择"星标" 快速获得最新干货 本文转自机器之心 今天也要做实验吗?不必了,现在有机器人可以帮忙. 在化学.生物等领域,不少研究生的生活可 ...

  3. 被强制007加班!他愤而把加班证据发给国外供应商和大客户!客户纷纷取消订单!他去度假,老板气疯!...

    被pua了怎么办?被强制007又怎么办? 大多数人可能就忍气吞声了,但是哪里有压迫哪里就有反抗,总有人受不了奋起反抗.有位腾讯员工的朋友被pua007压迫太久,一怒之下做了这件事,重创老板,大快人心! ...

  4. Java笔试面试题007

    Java笔试面试题007 1.请用正則表達式匹配出QQ号(如果QQ号码为5-10位). 解答: ^ \d{5,10}$ 2.String, StringBuffer StringBuilder的差别. ...

  5. 连影--影子007的回忆

    影子007的回忆    影子006是我从2年级起,一直陪着我回家,陪着我笑,陪着我哭,陪着我疯,陪着我傻得一个--外表斯文却内心强大的小女生!她就是--张晓彤.    我家楼下的彩板房,是我们友谊的见 ...

  6. CIA困局:天下再无007,AI识别下无处遁行的“特工”们

    也许有一天,举枪的邦德将真的会成为只在电影里存在的画面. 007们所依赖的伪造身份正在被他们自己曾经引以为豪的高科技秘密武器所识别.他们的快速反应能力.强大的心理素质也注定无法与正迅速成长的AI鉴别力 ...

  7. 阿里2500万美元战略投资“神工007”,天猫全面布局建材家居新零售

    11月12日消息,阿里巴巴宣布向家装后市场服务平台"神工007"战略投资2500万美元.天猫将与"神工007"将展开深度合作,布局建材家居新零售,打通线上线下数 ...

  8. VMware安装虚拟机Ubuntu提示piix4_smbus 0000:00:007.3: Host SMBus controller not enabled错误解决办法...

    安装ubuntu17.10.1虚拟机,遇到了一个问题,就是这个piix4_smbus 0000:00:007.3: Host SMBus controller not enabled. 网上找到了一个 ...

  9. 宁宛 机器人_全文阅读 .007 忠犬机器人

    全文阅读 .007 忠犬机器人 " 其实光看i5高大的身躯.泛着金属光泽的外壳,很难想象它能把照顾人的事情做的那么细致.这张同样自带程序的金属床在i5的操作下,根据宁宛自身的体重及骨密度,调 ...

  10. 996!007!同是敲了2万行代码,为什么他却晋升了?

    @正在敲代码的你 ,春节假期即将来临,复盘这1年,你印象最深刻的一件事是什么? 有人在群里回答了一条扎心的答案:忙碌1年,每天996,回首2019除了加班再无成长可说. 你以为只要把事情搞定了,成长是 ...

最新文章

  1. 计算机科学AP考试,AP计算机科学A和计算机原理有什么区别
  2. JAVA网络编程之Socket
  3. TS流头部的调整字段
  4. 动手学CV-目标检测入门教程:基本概念
  5. Bootstrap 媒体列表
  6. 减少 JavaScript 代码量的原生技术
  7. 用 Python 分析 CSDN 小姐姐一年都做了啥
  8. 循环队列 代码实现(FIFO)
  9. 短视频源码:新兴行业的一匹黑马
  10. ps 缩放 颜色分类 像素和分辨率学习笔记
  11. 使用Java的MessageDigest实现MD5加密算法
  12. come的喂abc是什么梗
  13. 微信小程序前端服务外包
  14. android 电话管理
  15. Linux文档编辑命令
  16. 桌面出现“了解此图片”如何删除?
  17. 产品运营模型:AARRR模型
  18. PostgreSQL数据库之国际化语言支持学习总结
  19. 关于 Linux中卷/分区等知识的一些总结
  20. Forever Young 永远年轻

热门文章

  1. 15_心理咨询_微信小程序项目实战_数据交互_首页
  2. 小米与魅族同样使304有什么区别呢
  3. 计算机桌面图标靠右,使桌面图标靠右排列
  4. 2021年电工(技师)作业考试题库及电工(技师)实操考试视频
  5. 2022年电工(高级)考试题库及电工(高级)实操考试视频
  6. 【专业知识问答】问:什么是发电机失磁?失磁后为何转入异步运行状态?有何不良影响?
  7. OSChina 周六乱弹 ——程序员是无所不能的
  8. Uncaught TypeError: Cannot set properties of null (setting ‘innerHTML‘)报错的一种
  9. 收集淘宝店铺资料的小程序
  10. CoordConv:卷积神经网络「失陷」,CoordConv来填坑