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

ConstantValueDescription
Qt::TabFocus0x01小部件通过Tab接受焦点
Qt::ClickFocus0x02小部件通过单击接受焦点
Qt::StrongFocusTabFocus | ClickFoucs | 0x08小部件通过Tab键和单击接受焦点,在MacOS上,这也表明当处于文本/列表焦点模式
Qt::WheelFocusStrongFocus | 0x04Qt::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中引入。放个链接吧https://www.cnblogs.com/hqu-ye/articles/5078370.html

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

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟


以上是关于BestMPRBaseVtk-002-修改工程,搬运官方代码并尝试理解-1的主要内容,如果未能解决你的问题,请参考以下文章

(原创)多系统间需要对接,我写了一个接口框架。实用性非常强,写出来大家交流。需要的可以直接搬过去用。(第1篇)

非计算机搬砖人的自我提升之路——开端

洛谷 P1126 机器人搬重物 (BFS)

软件工程课程体会

95后,月薪4K到2W+!纯小白到python自动化工程师,下定决心的事情肯定能做成

软件工程第一次作业补充