Embedding PCL Viewer on a Qt GUI Main Window

user2288947 picture user2288947 · Apr 17, 2013 · Viewed 7.4k times · Source

I am trying to develop a user interface using QtCreator on a Windows 7 64-bit machine. This user interface will be deployed on a 32-bit Windows 7 machine, and will control a projector and a camera for a structured-light application. For reasons beyond my control (compatibility with camera and projector's APIs), I will use the MS VS 2010 32bit compiler for this. After a couple of weeks trying to have everything I need working together (Qt 4.8.4, QtCreator and Point Cloud Library), I am now facing a slight problem.

Is there a way that I can embed the PCL Point Cloud Viewer inside my main Qt GUI window? The problem is that when I use the PCL viewer, it brings up a separate window. I want this window to be embedded inside my main window, and I want to still be able to interact with it (rotate, pan, zoom, etc.).

As you may be able to tell from my post, I am a newbie on Qt/PCL/etc., so any example with minimal code to do this would be greatly appreciated. I have done weeks of research on this and I have not been able to find a solution, although I get the impression that a Qt Widget might be the way to go.

Answer

Bart picture Bart · Apr 17, 2013

You can simply use PCL's PCLVisualizer, which is extensively described here, via the QVTKWidget. This is the setup I'm currently running. So you would end up doing something along the lines of the following (pseudo-)code:

In your header:

class PointCloudWidget : public QVTKWidget
{
    //Whatever comes before (constructor, methods, etc.)

private:

    pcl::visualization::PCLVisualizer m_visualizer;
};

And in your cpp:

PointCloudWidget::PointCloudWidget(QWidget *parent) : QVTKWidget(parent)
{
    this->SetRenderWindow(m_visualizer.getRenderWindow());
}

You can then use the visualizer to achieve the same functionality as the PCL viewer has.