【VS2019 Qt5 VTK9.2】界面编程问题&解决记录

一、Qt和VTK相关问题及解决

1. Widget和Viewer的设置顺序

 imageViewer->SetupInteractor(renderWindow->GetInteractor());
 ui.qvtkWidget->setRenderWindow(imageViewer->GetRenderWindow());

二者顺序决定了能否正确显示。
参考:QVTKWidget和vtkImageViewer2结合编程设置顺序问题

2. 控件提升

因为版本问题无法找到QVTKWidget时,可以考虑控件提升:
将一个widget 提升为QVTKOpenGLNativeWidget
参考:QT5.14.2配置QVTKOpenGLNativeWidget控件并在QT中显示VTK窗口

(但还是建议根据对应版本直接使用QVTKOpenGLNativeWidget及其新功能。)

3. QVTKWidget、QVTKOpenGLNativeWidget版本区别

【VS2019 Qt5 VTK9.2】界面编程问题&解决记录_第1张图片
参考:PCL1.12.1+VTK9.1+Qt5.14.2VS创建Qt项目在widget上显示点云

4. 定义vtkGenericOpenGLRenderWindow

报错:QVTKOpenGLNativeWidget requires a vtkGenericOpenGLRenderWindow.
vtkWin32OpenGLRenderWindow is not supported.

【VS2019 Qt5 VTK9.2】界面编程问题&解决记录_第2张图片
文档说到QOpenGLWidget subclass to house a vtkGenericOpenGLRenderWindow in a Qt application,即QVTKOpenGLNativeWidget 是QOpenGLWidget 的子类,需要在Qt中容纳一个vtkGenericOpenGLRenderWindow 渲染窗口。
(建议直接在窗口定义就定义为vtkGenericOpenGLRenderWindow渲染窗口。)

二、VS报错

5. LNK2005 "public: static class …"已经在 …obj 中定义

错误	LNK2005	"public: static class myVtkInteractorStyleImage * __cdecl myVtkInteractorStyleImage::New(void)" (?New@myVtkInteractorStyleImage@@SAPEAV1@XZ) 已经在 mainwindow.obj 中定义	

参考:静态成员变量初始化问题。关于 error LNK2005 static int:已经在***.obj中定义。

主要原因有以下三种:

1.重复定义全局变量;

2.头文件的包含重复;

3.使用第三方的库造成的。

6. LNK2019 无法解析的外部符号

参考:vs报错“错误 LNK2019 无法解析的外部符号”的几种原因及解决方案

(常见的可能原因:所使用的外部库未正确添加到项目中来。)
直接解决:更新CMakeLists 或者 “打开项目->属性->配置属性”添加库目录或文件

7. 报错:QObject::connect: No such slot或者QObject::connect: No such signal

参考:QObject::connect: No such slot或者QObject::connect: No such signal
两个原因导致:

1.传递参数的时候不能带变量名,只能含有变量类型

connect(objectA,SIGNAL(signal_1(int)),objectB,SLOT(slot_test(int)));

【VS2019 Qt5 VTK9.2】界面编程问题&解决记录_第3张图片

2.类中必须包含Q_OBJECT

【VS2019 Qt5 VTK9.2】界面编程问题&解决记录_第4张图片
另:
QT的默认槽函数 connectSlotsByName

只要槽函数名规则是这样的:on_子对象名_信号名,如:

public slots:
   void on_actionNew_triggered();

就可以不用写connect函数来连接信号和槽了,需注意不要重复命名或多次重复连接

参考:QT 默认槽函数 connectSlotsByName浅析

你可能感兴趣的:(Tipnotes,qt,c++,笔记)