BestMPRBaseVtk-002-修改工程,搬运官方代码并尝试理解-1
Posted DreamLife.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BestMPRBaseVtk-002-修改工程,搬运官方代码并尝试理解-1相关的知识,希望对你有一定的参考价值。
修改工程,搬运官方代码并尝试理解-1
昨天,苹果刚发布了他们的新产品,带刘海的笔记本出现了,真的很哇瑟呀。昨天夜里又梦到张扁扁了,哎。
今天这篇主要是水一篇,在原来的基础上,引入了另一个名称的插件,两个插件功能一样,名字不一样而已,还有一个实现工程,因为我没发现搞成插件,不好测试,至少目前还没有发现啥好的测试方法,只能每次替换Qt目录下的插件,好费力,所以我就先直接先建一个普通的工程,把功能都实现了,在做迁移。
关键字:
Qt 插件
、VTK9.0.3
、子项目
、测试
、实现
1 新增子项目
相比之前,多了公司的插件工程和代码实现工程,因为如果直接写插件,目前我还不知道咋调试,每次都需要把插件放到Qt目录下,还得重启Qt,真的好烦人呀。
后面基本思想还是移植vtk官方的插件内容,先搞起来再说吧。
2 先可以显示图片了
本次显示图片毫无任何技术含量,就是官方库换名字。上面自己抄官方代码来的,下面是使用官方内容。没有任何技术含量。
3 理解官方代码
3.1 构造函数
BPPMPRWidget::BPPMPRWidget(QWidget *parent, Qt::WindowFlags f) : BPPMPRWidget(vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New().GetPointer(),parent,f)
{
}
BPPMPRWidget::BPPMPRWidget(vtkGenericOpenGLRenderWindow *window, QWidget *parent, Qt::WindowFlags f) : Superclass(parent,f),RenderWindow(nullptr),RenderWindowAdapter(nullptr),EnableHiDPI(true),UnscaledDPI(72),DefaultCursor(QCursor(Qt::ArrowCursor))
{
//默认设置为强焦点
this->setFocusPolicy(Qt::StrongFocus); //焦点策略,即小部件可以通过Tab键和单击接受焦点,在MacOS上,这也表明当处于"文档、列表焦点模式"时,小部件接受选项卡焦点
this->setUpdateBehavior(QOpenGLWidget::NoPartialUpdate);
this->setMouseTracking(true);
//使用本地updateSize替换原来的resize
this->connect(this,&BPPMPRWidget::resized,this,&BPPMPRWidget::updateSize);
this->setRenderWindow(window);
//启用Qt手势支持
this->grabGesture(Qt::PinchGesture);
this->grabGesture(Qt::PanGesture);
this->grabGesture(Qt::TapGesture);
this->grabGesture(Qt::TapAndHoldGesture);
this->grabGesture(Qt::SwipeGesture);
}
3.1.1 焦点策略
在代码中遇到的第一个函数setFocusPolicy
用来设置Qt小部件的焦点。具体参数为enum Qt::FocusPolicy
Constant | Value | Description |
---|---|---|
Qt::TabFocus | 0x01 | 小部件通过Tab接受焦点 |
Qt::ClickFocus | 0x02 | 小部件通过单击接受焦点 |
Qt::StrongFocus | TabFocus | ClickFoucs | 0x08 | 小部件通过Tab键和单击接受焦点,在MacOS上,这也表明当处于文本/列表焦点模式 |
Qt::WheelFocus | StrongFocus | 0x04 | Qt::StringFocus plus,它通过使用鼠标滚轮来接受焦点 |
Qt::NoFocus | 0 | 小部件不接受焦点 |
3.1.2 setUpdateBehavior
这个函数将设置小部件的更新行为,这个函数是在Qt5.5 以后新增的参数为enum QOpenGLWidget::UpdateBehavior
,
Constant | Value | Description |
---|---|---|
QOpenGLWidget::NoPartialUpdate | 0 | 在QOpenGLWidget呈现到屏幕之后,QOpenGLWidget将丢弃颜色缓冲区和辅助缓冲区的内容。 这与调用QOpenGLContext::swapBuffers的行为是相同的,使用默认的启用了opengl的QWindow作为参数。 当framebuffer对象用作呈现目标时,NoPartialUpdate在移动和嵌入式空间中常见的某些硬件架构上有一些性能优势。 如果支持glDiscardFramebufferEXT或glClear,则framebuffer对象在使用glDiscardFramebufferEXT的帧之间无效 |
QOpenGLWidget::PartialUpdate | 1 | framebuffer对象颜色缓冲区和辅助缓冲区不会在帧之间失效 |
3.1.3 setMouseTracking
这个函数是用来设置窗口鼠标监听的,当false时,只有至少一个鼠标被按下时,这个窗口部件才会接受鼠标事件,如果为true,在鼠标没有按键按下时,这个窗口也会获得鼠标事件。
这里有个问题需要注意,使用setMouseTracking(true)对鼠标进行监控(mouseMoveEvent(QMouseEvent *event)),如果WidgetA有个子窗体WidgetB会占据WidgetA的绝大部分空间,那么当鼠标移动到WidgetB上时,WidgetA就会失去对鼠标的监控。
使用
setAttribute( Qt::WA_Hover,true)
也可以实现对鼠标的监控,相对于setMouseTracking(true)
来说,它可以弥补鼠标事件被子窗体获取的问题:bool Widget::event(QEvent *e) { if (e->type() == QEvent::HoverEnter || e->type() == QEvent::HoverLeave || e->type() == QEvent::HoverMove) { QHoverEvent* pHoverEvent = static_cast<QHoverEvent *>(e); setMouseStatus(pHoverEvent->pos()); } return QWidget::event(e); }
3.1.4 grabGesture
启用带有特定标志的给定手势,在Qt4.6中引入。放个链接吧https://www.cnblogs.com/hqu-ye/articles/5078370.html
Constant | Value | Description |
---|---|---|
Qt::TapGesture | 1 | 点击手势 |
Qt::TapAndHoldGesture | 2 | 长按手势 |
Qt::PanGesture | 3 | 距离移动 |
Qt::PinchGesture | 4 | 缩放手势 |
Qt::SwipeGesture | 5 | 滑动手势 |
Qt::CustomGesture | 0x0100 | 自定义了吧 |
☞ 源码
源码链接:GitHub仓库自取
使用方法:☟☟☟
以上是关于BestMPRBaseVtk-002-修改工程,搬运官方代码并尝试理解-1的主要内容,如果未能解决你的问题,请参考以下文章
(原创)多系统间需要对接,我写了一个接口框架。实用性非常强,写出来大家交流。需要的可以直接搬过去用。(第1篇)