Qt使用VTK遇到的一些問題


一、vtkOrientationMarkerWidget在Qt窗口中不顯示

  1. 注意this->setRenderWindow(renderWindow);this->renderWindow()->AddRenderer(renderer);以及omw->EnabledOn();代碼段的位置

  2. vtkOrientationMarkerWidget不要在局部使用智能指針,出了作用域會被析構

點擊查看代碼
/*VTKWidget繼承自QVTKRenderWidget*/
VTKWidget::VTKWidget()
{
        vtkNew<vtkNamedColors> colors;

	vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
	this->setRenderWindow(renderWindow);

	vtkNew<vtkInteractorStyleRubberBand3D> style;
	this->interactor()->SetInteractorStyle(style);

	// Sphere
	vtkNew<vtkSphereSource> sphereSource;
	sphereSource->Update();
	vtkNew<vtkPolyDataMapper> sphereMapper;
	sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
	vtkNew<vtkActor> sphereActor;
	sphereActor->SetMapper(sphereMapper);
	sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());

	// VTK Renderer
	vtkNew<vtkRenderer> renderer;
	renderer->AddActor(sphereActor);
	renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
	renderer->ResetCamera();

	// Connect VTK with Qt
	this->renderWindow()->AddRenderer(renderer);

	std::array<double, 3> scale{ {1.0, 1.0, 1.0} };

	vtkAxesActor* axes = vtkAxesActor::New();
	axes->SetScale(1,1,1);
	axes->SetShaftTypeToCylinder();

	axes->SetCylinderRadius(0.5 * axes->GetCylinderRadius());  //軸的粗細
	axes->SetConeRadius(1.025 * axes->GetConeRadius());        //圓錐的大小
	axes->SetSphereRadius(1.5 * axes->GetSphereRadius());

	vtkTextProperty* tprop = axes->GetXAxisCaptionActor2D()->GetCaptionTextProperty();
	tprop->ItalicOn();  //啟用文本斜體
	tprop->ShadowOn();  //啟用文本陰影
	tprop->SetFontFamilyToTimes();  //字體
	tprop->SetColor(1, 1, 1);  //標簽文字顏色

	axes->GetYAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy(tprop);
	axes->GetZAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy(tprop);

        // 將omw聲明為成員變量
	vtkOrientationMarkerWidget* omw = vtkOrientationMarkerWidget::New();
	omw->SetOrientationMarker(axes);
	omw->SetViewport(0.8, 0, 1.0, 0.2);
	omw->SetOutlineColor(1, 0, 0);
	omw->SetInteractor(this->interactor());
	omw->EnabledOn();
	omw->InteractiveOn();
}

二、Qt中使用VTK,渲染窗口背景顏色閃爍,圖元不顯示

  1. 背景顏色閃爍是因為直接調用了renderer->Render();

  2. 圖元不顯示是因為沒有調用renderer->GetRenderWindow()->Render();

點擊查看代碼
/*this 繼承自QVTKRenderWidget*/
	//renderer
	vtkNew<vtkRenderer> renderer;
	renderer->SetBackground(.1,.2,.3);
	renderer->AddActor(cubeActor);
	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();

	//RenderWindow
	vtkNew<vtkGenericOpenGLRenderWindow> renWin;
	renWin->AddRenderer(renderer);

	this->setRenderWindow(renWin);
	//renderer->Render();  //調用該函數會導致窗口背景閃爍,甚至程序崩潰,可以使用下面的接口解決
	renderer->GetRenderWindow()->Render();

三、雲圖只顯示一種顏色

檢查mapper是否設置了range 即 vtkPolyDataMapper->SetScalarRange(range);

四、報錯:"static_cast":無法從"vtkObjectBase* const"轉換為"T*"

只有類的前置聲明,沒有實際包含頭文件,一般發生在頭文件中定義函數,但只聲明了vtk類

五、中斷:"Cannot make QOpenGLContext current in a different thread"

同一個上下文不能在多個線程中使用,報該錯誤的原因是因為在不同線程調用了vtk的Render()函數,保證在同一個線程調用Render即可解決。

六、析構函數崩潰

原因1:回調函數

窗口的同一個事件添加多個回調函數,例如:

vtkRenderWindow->AddObserver(vtkCommand::WindowResizeEvent,CallBack1);
vtkRenderWindow->AddObserver(vtkCommand::WindowResizeEvent,CallBack2);

原因2:智能指針

智能指針使用問題,如果出現問題可以排查一下是否將std::shared_ptr改為std::weak_ptr

原因3:Qt對象自動銷毀

Qt父對象銷毀,子對象跟着一起銷毀,導致vtk的智能指針vtkSmartPointer銷毀對象的是時候,該對象已經被銷毀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM