一、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版本区别
参考:PCL1.12.1+VTK9.1+Qt5.14.2VS创建Qt项目在widget上显示点云
4. 定义vtkGenericOpenGLRenderWindow
报错:QVTKOpenGLNativeWidget requires a vtkGenericOpenGLRenderWindow.
vtkWin32OpenGLRenderWindow is not supported.
文档说到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)));
2.类中必须包含Q_OBJECT。
另:
QT的默认槽函数 connectSlotsByName
只要槽函数名规则是这样的:on_子对象名_信号名,如:
public slots:
void on_actionNew_triggered();
就可以不用写connect函数来连接信号和槽了,需注意不要重复命名或多次重复连接。
参考:QT 默认槽函数 connectSlotsByName浅析