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

VTK交互系统 4 自定义交互器样式2 键盘鼠标交互器设置

全部VTK程序设计系列博客 见 VTK程序设计系列

现在我们修改一下其中一个事件函数:

void my3DCameraStyle::OnLeftButtonDown(void)
{
	vtkInteractorStyleUser::OnLeftButtonDown();
	GetLastPos(m_OldPos[0], m_OldPos[1]);
	cout << "m_OldPos = " << m_OldPos[0] << "," << m_OldPos[1] << endl;
}

然后编译运行。可以看到每次点击屏幕,都会在屏幕上输出点击的位置。说明我们的交互器是起作用的。

突然觉得交互器样式的系列写完了。

要不要把上面几行放在上一个博客里算了?

emmmmmmm

貌似如果再写与具体功能实现有关的函数也没有什么意义,为了凑点内容,我就先写写滚轮,再写写与键盘有关的事件吧。

void my3DCameraStyle::OnMouseWheelBackward(void)
{
	vtkInteractorStyleUser::OnMouseWheelBackward();

};

滚轮也是没啥可写的,每次滚动的时候都在里面做点事就好了,比如把图像放大:

vtkSmartPointer<vtkRenderWindow>renderWindow;
int width = 512;int height = 512;
int windowWidth = 600,windowHeight = 600;

我们把renderWindow设为全局的,然后定义两个变量,之后我们改一下函数:

void my3DCameraStyle::OnMouseWheelForward(void)
{
	vtkInteractorStyleUser::OnMouseWheelForward();
	windowWidth += 3;
	windowHeight += 3;
	renderWindow->SetSize(windowWidth, windowHeight);

};

void my3DCameraStyle::OnMouseWheelBackward(void)
{
	vtkInteractorStyleUser::OnMouseWheelBackward();
	windowWidth -= 3;
	windowHeight -= 3;
	renderWindow->SetSize(windowWidth, windowHeight);
};

键盘:

	/**
	* OnChar is triggered when an ASCII key is pressed. Some basic key presses
	* are handled here ('q' for Quit, 'p' for Pick, etc)
	*/
	virtual void OnChar();

	// OnKeyDown is triggered by pressing any key (identical to OnKeyPress()).
	// An empty implementation is provided. The behavior of this function should
	// be specified in the subclass.
	virtual void OnKeyDown();

	// OnKeyUp is triggered by releaseing any key (identical to OnKeyRelease()).
	// An empty implementation is provided. The behavior of this function should
	// be specified in the subclass.
	virtual void OnKeyUp();

	// OnKeyPress is triggered by pressing any key (identical to OnKeyDown()).
	// An empty implementation is provided. The behavior of this function should
	// be specified in the subclass.
	virtual void OnKeyPress();

	// OnKeyRelease is triggered by pressing any key (identical to OnKeyUp()).
	// An empty implementation is provided. The behavior of this function should
	// be specified in the subclass.
	virtual void OnKeyRelease();

这是直接从其他的默认交互器上摘抄下来的,大家复制到类里面。然后先实现第一个函数:

void my3DCameraStyle::OnChar()
{
	vtkRenderWindowInteractor *rwi = this->Interactor;

	switch (rwi->GetKeyCode())
	{
		case 'f':
		case 'F':
			cout << "aaaaaaa " << endl;
	}
}

现在按 F 或者 f 的时候就会打印 aaaaaaa

根据示意,onKeyDown 和 onKeyPress是一样的。我也不知道它干嘛要搞这玩意,估计是有的系统名字叫keyDown,有的叫keyPress,VTK为了体现兼容性和用户良好性直接创建了两种名字的同一种功能的函数(瞎搞啥)。

然后我们实现该函数:

void my3DCameraStyle::OnKeyDown()
{
	vtkRenderWindowInteractor *rwi = this->Interactor;

	switch (rwi->GetKeyCode())
	{
	case 'f':
	case 'F':
		cout << "bbbbbbbbb " << endl;
	}
}

现在再点击 f 就会同时打印出来两行:(有意思吗?没意思。。。。。)

bbbbbbbbb

aaaaaaa

不过这个按键可以用来检测按下的其他功能,鉴于很多默认交互器都没有实现,大概实在是个不太重要的玩意,为了知识的完整性这里也还是写上吧:

我们先改改函数:

void my3DCameraStyle::OnKeyDown()
{
	switch (this->Interactor->GetKeyCode())
	{

	}
	cout << "sssssss " << endl;
}

可以看到如果你按了shift等非数字键就会只输出sssssss,而不会输出aaaaaaa

现在我们改为:

void my3DCameraStyle::OnKeyDown()
{
	
	switch (this->Interactor->GetKeyCode())
	{
		case 0x9:
			cout << "sssssss " << endl;
			break;
	}
}

键值0x9代表的是Tab键。

现在我们运行,按下Tab,就会打印ssssss

交互器样式系列就介绍到这里,一共4篇,其实很简单。

相关文章:

  • Qt多线程1
  • Qt多线程2
  • 基于QT的文件管理软件编写 系列 引言
  • 基于QT的文件管理软件编写 系列 1
  • python安装tensorflow
  • 机器学习之 Keras默认数据集/模型存放位置
  • 从零开始写出分而治之查找最大子列表的算法
  • 学机器学习必备的一些python句法基础 1 列表 元组 字典 条件语句
  • 学机器学习必备的一些python句法基础 2 循环
  • 学机器学习必备的一些python句法基础 3 函数 内建函数 模块 包 全局局部变量
  • 学机器学习必备的一些python句法基础 4 Python类和对象
  • 学机器学习必备的一些python句法基础 5 文件读写
  • 算法 后缀表达式计算加减乘除
  • 算法题分析 出入栈问题
  • 算法 队列问题(浙大数据结构视频作业)
  • php的引用
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java程序员幽默爆笑锦集
  • Java反射-动态类加载和重新加载
  • Redis 中的布隆过滤器
  • Vue 重置组件到初始状态
  • 仿天猫超市收藏抛物线动画工具库
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何学习JavaEE,项目又该如何做?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (二)斐波那契Fabonacci函数
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转载)Google Chrome调试JS
  • .describe() python_Python-Win32com-Excel
  • .net Stream篇(六)
  • .net/c# memcached 获取所有缓存键(keys)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net下简单快捷的数值高低位切换
  • @Autowired和@Resource装配
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ solr入门 ] - 利用solrJ进行检索
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [] 与 [[]], -gt 与 > 的比较
  • []error LNK2001: unresolved external symbol _m
  • [100天算法】-实现 strStr()(day 52)
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20170728]oracle保留字.txt
  • [Angular 基础] - 数据绑定(databinding)
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包