VTK/Examples/Cxx/Qt/RenderWindowUIMultipleInheritance

From KitwarePublic
< VTK‎ | Examples‎ | Cxx‎ | Qt
Jump to navigationJump to search

Description

Using a QVTKWidget with the Qt Multiple Inheritance model. In contrast to the single inheritance example the main widget is here derived from QMainWindow as well as the class defining the form (Ui::RenderWindowUIMultipleInheritance).

Qt-RenderWindowUISingleInheritance.png

RenderWindowUIMultipleInheritanceDriver.cxx

#include <QApplication>
#include "RenderWindowUIMultipleInheritance.h"

int main(int argc, char** argv)
{
  QApplication app(argc, argv);

  RenderWindowUIMultipleInheritance renderWindowUIMultipleInheritance;
  renderWindowUIMultipleInheritance.show();

  return app.exec();
}

RenderWindowUIMultipleInheritance.h

#ifndef RenderWindowUIMultipleInheritance_H
#define RenderWindowUIMultipleInheritance_H

#include "ui_RenderWindowUIMultipleInheritance.h"

#include <QMainWindow>

class RenderWindowUIMultipleInheritance : public QMainWindow, private Ui::RenderWindowUIMultipleInheritance
{
  Q_OBJECT
public:

  RenderWindowUIMultipleInheritance();

public slots:

  virtual void slotExit();

};

#endif

RenderWindowUIMultipleInheritance.cxx

#include "RenderWindowUIMultipleInheritance.h"

#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkSphereSource.h>
#include <vtkSmartPointer.h>

// Constructor
RenderWindowUIMultipleInheritance::RenderWindowUIMultipleInheritance()
{
  this->setupUi(this);

  // Sphere
  vtkSmartPointer<vtkSphereSource> sphereSource =
    vtkSmartPointer<vtkSphereSource>::New();
  sphereSource->Update();
  vtkSmartPointer<vtkPolyDataMapper> sphereMapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
  sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
  vtkSmartPointer<vtkActor> sphereActor =
    vtkSmartPointer<vtkActor>::New();
  sphereActor->SetMapper(sphereMapper);

  // VTK Renderer
  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderer->AddActor(sphereActor);

  // VTK/Qt wedded
  this->qvtkWidget->GetRenderWindow()->AddRenderer(renderer);

  // Set up action signals and slots
  connect(this->actionExit, SIGNAL(triggered()), this, SLOT(slotExit()));

};

void RenderWindowUIMultipleInheritance::slotExit()
{
  qApp->exit();
}

RenderWindowUIMultipleInheritance.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>RenderWindowUIMultipleInheritance</class>
 <widget class="QMainWindow" name="SimpleView">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>541</width>
    <height>583</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>RenderWindowUIMultipleInheritance</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QVTKWidget" name="qvtkWidget">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>20</y>
      <width>511</width>
      <height>541</height>
     </rect>
    </property>
   </widget>
  </widget>
  <action name="actionOpenFile">
   <property name="enabled">
    <bool>true</bool>
   </property>
   <property name="text">
    <string>Open File...</string>
   </property>
  </action>
  <action name="actionExit">
   <property name="text">
    <string>Exit</string>
   </property>
  </action>
  <action name="actionPrint">
   <property name="text">
    <string>Print</string>
   </property>
  </action>
  <action name="actionHelp">
   <property name="text">
    <string>Help</string>
   </property>
  </action>
  <action name="actionSave">
   <property name="text">
    <string>Save</string>
   </property>
  </action>
 </widget>
 <customwidgets>
  <customwidget>
   <class>QVTKWidget</class>
   <extends>QWidget</extends>
   <header>QVTKWidget.h</header>
  </customwidget>
 </customwidgets>
 <resources>

 </resources>
 <connections/>
</ui>

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
 
if(POLICY CMP0020)
  cmake_policy(SET CMP0020 NEW)
endif()

PROJECT(RenderWindowUIMultipleInheritance)

find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

if(${VTK_VERSION} VERSION_GREATER "6" AND VTK_QT_VERSION VERSION_GREATER "4")
  # Instruct CMake to run moc automatically when needed.
  set(CMAKE_AUTOMOC ON)
  find_package(Qt5Widgets REQUIRED QUIET)
else()
  find_package(Qt4 REQUIRED)
  include(${QT_USE_FILE})
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})

file(GLOB UI_FILES *.ui)
file(GLOB QT_WRAP *.h)
file(GLOB CXX_FILES *.cxx)

if(${VTK_VERSION} VERSION_GREATER "6" AND VTK_QT_VERSION VERSION_GREATER "4")
  qt5_wrap_ui(UISrcs ${UI_FILES} )
  # CMAKE_AUTOMOC in ON so the MOC headers will be automatically wrapped.
  add_executable(RenderWindowUIMultipleInheritance MACOSX_BUNDLE
    ${CXX_FILES} ${UISrcs} ${QT_WRAP})
  qt5_use_modules(RenderWindowUIMultipleInheritance Core Gui)
  target_link_libraries(RenderWindowUIMultipleInheritance ${VTK_LIBRARIES})
else()
  QT4_WRAP_UI(UISrcs ${UI_FILES})
  QT4_WRAP_CPP(MOCSrcs ${QT_WRAP})
  add_executable(RenderWindowUIMultipleInheritance MACOSX_BUNDLE ${CXX_FILES} ${UISrcs} ${MOCSrcs})

  if(VTK_LIBRARIES)
    if(${VTK_VERSION} VERSION_LESS "6")
      target_link_libraries(RenderWindowUIMultipleInheritance ${VTK_LIBRARIES} QVTK)
    else()
      target_link_libraries(RenderWindowUIMultipleInheritance ${VTK_LIBRARIES})
    endif()
  else()
    target_link_libraries(RenderWindowUIMultipleInheritance vtkHybrid QVTK vtkViews ${QT_LIBRARIES})
  endif()
endif()

Download and Build RenderWindowUIMultipleInheritance

Click here to download RenderWindowUIMultipleInheritance. and its CMakeLists.txt file.

Once the tarball RenderWindowUIMultipleInheritance.tar has been downloaded and extracted,

cd RenderWindowUIMultipleInheritance/build

This example requires Qt and VTK.

  • If VTK and Qt are installed:
cmake ..
  • If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:
cmake -DVTK_DIR:PATH=/home/me/vtk_build ..
  • If Qt is not found on your system, you will need to tell CMake where to find qmake:
cmake -DQT_QMAKE_EXECUTABLE:FILEPATH=/usr/something/qmake  ..

Build the project:

make

and run it:

./RenderWindowUIMultipleInheritance

WINDOWS USERS PLEASE NOTE: Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time. You may also need to add a Qt related path.