002_BestMPRBaseVtk 修改工程,搬运官方代码并尝试理解-1

147 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

头图

修改工程,搬运官方代码并尝试理解-1

昨天,苹果刚发布了他们的新产品,带刘海的笔记本出现了,真的很哇瑟呀。昨天夜里又梦到张扁扁了,哎。

今天这篇主要是水一篇,在原来的基础上,引入了另一个名称的插件,两个插件功能一样,名字不一样而已,还有一个实现工程,因为我没发现搞成插件,不好测试,至少目前还没有发现啥好的测试方法,只能每次替换Qt目录下的插件,好费力,所以我就先直接先建一个普通的工程,把功能都实现了,在做迁移。


修改工程,搬运官方代码并尝试理解-11 新增子项目2 先可以显示图片了3 理解官方代码3.1 构造函数3.1.1 焦点策略3.1.2 setUpdateBehavior3.1.3 setMouseTracking3.1.4 grabGesture☞ 源码

关键字: Qt 插件VTK9.0.3子项目测试实现

1 新增子项目

相比之前,多了公司的插件工程和代码实现工程,因为如果直接写插件,目前我还不知道咋调试,每次都需要把插件放到Qt目录下,还得重启Qt,真的好烦人呀。

image-20211020085255396

后面基本思想还是移植vtk官方的插件内容,先搞起来再说吧。

2 先可以显示图片了

本次显示图片毫无任何技术含量,就是官方库换名字。上面自己抄官方代码来的,下面是使用官方内容。没有任何技术含量。

gif6

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

ConstantValueDescription
Qt::TabFocus0x01小部件通过Tab接受焦点
Qt::ClickFocus0x02小部件通过单击接受焦点
Qt::StrongFocusTabFocusClickFoucs0x08小部件通过Tab键和单击接受焦点,在MacOS上,这也表明当处于文本/列表焦点模式
Qt::WheelFocusStrongFocus0x04Qt::StringFocus plus,它通过使用鼠标滚轮来接受焦点
Qt::NoFocus0小部件不接受焦点

3.1.2 setUpdateBehavior

这个函数将设置小部件的更新行为,这个函数是在Qt5.5 以后新增的参数为enum QOpenGLWidget::UpdateBehavior

ConstantValueDescription
QOpenGLWidget::NoPartialUpdate0在QOpenGLWidget呈现到屏幕之后,QOpenGLWidget将丢弃颜色缓冲区和辅助缓冲区的内容。 这与调用QOpenGLContext::swapBuffers的行为是相同的,使用默认的启用了opengl的QWindow作为参数。 当framebuffer对象用作呈现目标时,NoPartialUpdate在移动和嵌入式空间中常见的某些硬件架构上有一些性能优势。 如果支持glDiscardFramebufferEXT或glClear,则framebuffer对象在使用glDiscardFramebufferEXT的帧之间无效
QOpenGLWidget::PartialUpdate1framebuffer对象颜色缓冲区和辅助缓冲区不会在帧之间失效

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中引入。放个链接吧www.cnblogs.com/hqu-ye/arti…

ConstantValueDescription
Qt::TapGesture1点击手势
Qt::TapAndHoldGesture2长按手势
Qt::PanGesture3距离移动
Qt::PinchGesture4缩放手势
Qt::SwipeGesture5滑动手势
Qt::CustomGesture0x0100自定义了吧

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟

源码