<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;">Hello,<br><br>I'm writing a MIP-Viewer (I use vtkSmartVolumeMapper). The result of it should be displayed in a qt window. I use Qt 4.8.0 and VTK 5.10.<br>There are three classes:<br>- MIP-Viewer (VTK only)<br>- QVTKMIPViewer (widget that displays the MIP content)<br>- MainWindow (small application to illustrate my problem)<br><br>The MIP viewer is initialized with a placeholder object for the vtkSmartVolumeMapper. After clicking on a button (buttonLoadDicom) a dicom data set should be displayed instead of the placeholder. This does not work and I don't know why. I wrote three small classes listed below to illustrate the problem in my application. Calling SetInput(...) inside of
 the MainWindow constructor works but not outside of it.<br><br>Any idea why the dicom content is not displayed after clicking on the button? <br><br><br>CODE:<br>----- MainWindow -----<br>////////////////////////////////////////////////////////////////////////////////////<br>////////////////////////////////////////////////////////////////////////////////////<br>MainWindow::MainWindow(QWidget *parent) : QWidget(parent)<br>{<br>&nbsp;&nbsp;&nbsp; m_pDicomData = vtkDICOMImageReader::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;resize(800,600);<br>&nbsp;&nbsp;&nbsp; m_pQVTKMIPViewer = new QVTKMIPViewer(this);<br>&nbsp;&nbsp;&nbsp; m_pDicomData-&gt;SetDirectoryName("C:/dicom");<br>&nbsp;&nbsp;&nbsp; m_pDicomData-&gt;Update();<br>&nbsp;&nbsp;&nbsp; SetupUi();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //m_pQVTKMIPViewer-&gt;SetInput(m_pDicomData-&gt;GetOutput()); &lt;- THIS WORKS: DICOM CONTENT IS
 DISPLAYED<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br>void MainWindow::SetupUi()<br>{<br>&nbsp;&nbsp;&nbsp; buttonLoadDicom = new QPushButton("load DICOM", this);<br>&nbsp;&nbsp;&nbsp; connect(buttonLoadDicom, SIGNAL(clicked()), this, SLOT(OnLoadDicom()));<br><br>&nbsp;&nbsp;&nbsp; //layout<br>&nbsp;&nbsp;&nbsp; QVBoxLayout *mainLayout = new QVBoxLayout(this);<br>&nbsp;&nbsp;&nbsp; QHBoxLayout *hLayout = new QHBoxLayout(this);<br>&nbsp;&nbsp;&nbsp; hLayout-&gt;addWidget(buttonLoadDicom);<br>&nbsp;&nbsp;&nbsp; mainLayout-&gt;addWidget(m_pQVTKMIPViewer);<br>&nbsp;&nbsp;&nbsp; mainLayout-&gt;addLayout(hLayout);<br>&nbsp;&nbsp;&nbsp; this-&gt;setLayout(mainLayout);<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br>void MainWindow::OnLoadDicom() //slot<br>{<br>&nbsp;&nbsp;&nbsp; m_pQVTKMIPViewer-&gt;SetInput(m_pDicomData-&gt;GetOutput()); // &lt;- THIS DOES NOT
 WORK: DICOM CONTENT IS NOT DISPLAYED (command is executed after clicking...)<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br><br><br>----- QVTKMIPViewer -----<br>////////////////////////////////////////////////////////////////////////////////////<br>////////////////////////////////////////////////////////////////////////////////////<br>QVTKMIPViewer::QVTKMIPViewer(QWidget *parent) : QWidget(parent),<br>m_pMIPViewer(NULL),<br>m_pInteractor(NULL),<br>m_pQVTKWidget(NULL),<br>m_pRenderer(NULL),<br>m_pRenderWindow(NULL),<br>m_pImageData(NULL)<br>{<br>&nbsp;&nbsp;&nbsp; m_pMIPViewer = MIPViewer::New();<br>&nbsp;&nbsp;&nbsp; m_pQVTKWidget = new QVTKWidget(this);<br>&nbsp;&nbsp;&nbsp; m_pQVTKWidget-&gt;setMinimumSize(300,300);<br>&nbsp;&nbsp;&nbsp;
 m_pQVTKWidget-&gt;SetRenderWindow(m_pMIPViewer-&gt;GetRenderWindow());<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br>void QVTKMIPViewer::SetInput(vtkImageData* pImageData)<br>{<br>&nbsp;&nbsp;&nbsp; m_pMIPViewer-&gt;SetInput(pImageData);<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br><br><br>----- MIPVIEWER -----<br>////////////////////////////////////////////////////////////////////////////////////<br>////////////////////////////////////////////////////////////////////////////////////<br>MIPViewer::MIPViewer():vtkObject(),<br>m_dInitialLevel(2048),<br>m_dInitialWindow(4096)<br>{<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pColorFunc = vtkColorTransferFunction::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pOpacityFunc = vtkPiecewiseFunction::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pVolumeMapper = vtkSmartVolumeMapper::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pVolume =
 vtkVolume::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pVolumeProperty = vtkVolumeProperty::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderer = NULL;<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderWindow = NULL;<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pImageData = NULL;<br><br>&nbsp;&nbsp;&nbsp; vtkRenderWindow *renWin = vtkRenderWindow::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;SetRenderWindow(renWin);<br>&nbsp;&nbsp;&nbsp; renWin-&gt;Delete();<br><br>&nbsp;&nbsp;&nbsp; vtkRenderer *ren = vtkRenderer::New();<br>&nbsp;&nbsp;&nbsp; this-&gt;SetRenderer(ren);<br>&nbsp;&nbsp;&nbsp; ren-&gt;Delete();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; //set dummy data<br>&nbsp;&nbsp;&nbsp; m_pDummyImage = vtkImageData::New();<br>&nbsp;&nbsp;&nbsp; m_pDummyImage-&gt;SetDimensions(2,2,2);<br>&nbsp;&nbsp;&nbsp; m_pDummyImage-&gt;SetScalarTypeToUnsignedShort();<br>&nbsp;&nbsp;&nbsp; m_pDummyImage-&gt;AllocateScalars(); // allocate storage for image
 data<br>&nbsp;&nbsp;&nbsp; unsigned short * VolPtr = (unsigned short *) m_pDummyImage-&gt;GetScalarPointer();<br>&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;2*2*2; i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *VolPtr= 900;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *VolPtr++;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; m_pDummyImage-&gt;Update();<br><br>&nbsp;&nbsp;&nbsp; m_pColorFunc-&gt;AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0 );<br>&nbsp;&nbsp;&nbsp; m_pOpacityFunc-&gt;AddSegment( m_dInitialLevel - 0.5 * m_dInitialWindow, 0.0, m_dInitialLevel + 0.5 * m_dInitialWindow, 1.0 );<br>&nbsp;&nbsp;&nbsp; m_pVolumeProperty-&gt;SetColor( m_pColorFunc );<br>&nbsp;&nbsp;&nbsp; m_pVolumeProperty-&gt;SetScalarOpacity( m_pOpacityFunc );<br>&nbsp;&nbsp;&nbsp; m_pVolume-&gt;SetProperty( m_pVolumeProperty );<br>&nbsp;&nbsp;&nbsp; m_pVolumeMapper-&gt;SetBlendModeToMaximumIntensity();<br><br>&nbsp;&nbsp;&nbsp;
 this-&gt;SetInput(m_pDummyImage);<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pVolume-&gt;SetMapper(this-&gt;m_pVolumeMapper);<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br>void MIPViewer::SetRenderWindow(vtkRenderWindow *renWin)<br>{<br>&nbsp;&nbsp;&nbsp; if (this-&gt;m_pRenderWindow == renWin)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (this-&gt;m_pRenderWindow)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderWindow-&gt;UnRegister(this);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderWindow = renWin;<br><br>&nbsp;&nbsp;&nbsp; if (this-&gt;m_pRenderWindow)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderWindow-&gt;Register(this);<br>&nbsp;&nbsp;&nbsp;
 }<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br>void MIPViewer::SetRenderer(vtkRenderer *ren)<br>{<br>&nbsp;&nbsp;&nbsp; if (this-&gt;m_pRenderer == ren)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if(m_pRenderWindow &amp;&amp; m_pRenderer)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderWindow-&gt;RemoveRenderer(this-&gt;m_pRenderer);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (this-&gt;m_pRenderer)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderer-&gt;UnRegister(this);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderer = ren;<br><br>&nbsp;&nbsp;&nbsp; if (this-&gt;m_pRenderer)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderer-&gt;Register(this);<br>&nbsp;&nbsp;&nbsp;
 }<br><br>&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderWindow-&gt;AddRenderer(this-&gt;m_pRenderer);<br>&nbsp;&nbsp;&nbsp; this-&gt;m_pRenderer-&gt;AddViewProp(this-&gt;m_pVolume);<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br>void MIPViewer::SetInput(vtkImageData *pImageData)<br>{<br>&nbsp;&nbsp;&nbsp; m_pImageData = pImageData;<br>&nbsp;&nbsp;&nbsp; if(pImageData)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_pVolumeMapper-&gt;GetInput())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pVolumeMapper-&gt;RemoveAllInputs();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pVolumeMapper-&gt;SetInput(m_pImageData);<br>&nbsp;&nbsp;&nbsp; }<br>}<br>////////////////////////////////////////////////////////////////////////////////////<br>vtkImageData*
 MIPViewer::GetInput()<br>{<br>&nbsp;&nbsp;&nbsp; return m_pVolumeMapper-&gt;GetInput();<br>}<br>////////////////////////////////////////////////////////////////////////////////////</div></div></body></html>