소스 검색

ENH: WIP: Prefer QVTKOpenGLWidget

Prefer QVTKOpenGLWidget to QVTKLWidget when building with Qt5 and VTK8
using the OpenGL2 backend.
Max Smolens 8 년 전
부모
커밋
b09f7f67f2

+ 10 - 0
Libs/Visualization/VTK/Widgets/CMakeLists.txt

@@ -194,6 +194,16 @@ if(CTK_USE_QTTESTING)
   list(APPEND KIT_target_libraries QtTesting)
 endif()
 
+# Prefer QVTKOpenGLWidget to QVTKWidget when using Qt5
+set(_use_qvtkopenglwidget 1)
+if(CTK_QT_VERSION VERSION_LESS "5"
+  OR VTK_VERSION VERSION_LESS "8"
+  OR (NOT VTK_RENDERING_BACKEND STREQUAL "OpenGL2"))
+  set(_use_qvtkopenglwidget 0)
+endif()
+if(_use_qvtkopenglwidget)
+  add_definitions(-DCTK_USE_QVTKOPENGLWIDGET)
+endif()
 
 ctkMacroBuildLib(
   NAME ${PROJECT_NAME}

+ 14 - 0
Libs/Visualization/VTK/Widgets/ctkVTKAbstractView.cpp

@@ -29,6 +29,7 @@
 #include "ctkLogger.h"
 
 // VTK includes
+#include <vtkGenericOpenGLRenderWindow.h>
 #include <vtkOpenGLRenderWindow.h>
 #include <vtkRendererCollection.h>
 #include <vtkRenderWindowInteractor.h>
@@ -47,7 +48,11 @@ int ctkVTKAbstractViewPrivate::MultiSamples = 0;  // Default for static var
 ctkVTKAbstractViewPrivate::ctkVTKAbstractViewPrivate(ctkVTKAbstractView& object)
   : q_ptr(&object)
 {
+#if CTK_USE_QVTKOPENGLWIDGET
+  this->RenderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
+#else
   this->RenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
+#endif
   this->CornerAnnotation = vtkSmartPointer<vtkCornerAnnotation>::New();
   this->RequestTimer = 0;
   this->RenderEnabled = true;
@@ -63,7 +68,12 @@ void ctkVTKAbstractViewPrivate::init()
 
   this->setParent(q);
 
+#if CTK_USE_QVTKOPENGLWIDGET
+  this->VTKWidget = new QVTKOpenGLWidget;
+  this->VTKWidget->setEnableHiDPI(true);
+#else
   this->VTKWidget = new QVTKWidget;
+#endif
   q->setLayout(new QVBoxLayout);
   q->layout()->setMargin(0);
   q->layout()->setSpacing(0);
@@ -287,7 +297,11 @@ vtkCornerAnnotation* ctkVTKAbstractView::cornerAnnotation() const
 }
 
 //----------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+QVTKOpenGLWidget * ctkVTKAbstractView::VTKWidget() const
+#else
 QVTKWidget * ctkVTKAbstractView::VTKWidget() const
+#endif
 {
   Q_D(const ctkVTKAbstractView);
   return d->VTKWidget;

+ 8 - 0
Libs/Visualization/VTK/Widgets/ctkVTKAbstractView.h

@@ -25,7 +25,11 @@
 #include <QWidget>
 
 // VTK includes
+#if CTK_USE_QVTKOPENGLWIDGET
+#include <QVTKOpenGLWidget.h>
+#else
 #include <QVTKWidget.h>
+#endif
 
 // CTK includes
 #include "ctkVTKObject.h"
@@ -117,7 +121,11 @@ public:
   Q_INVOKABLE vtkCornerAnnotation* cornerAnnotation()const;
 
   /// Get the underlying QVTKWidget
+#if CTK_USE_QVTKOPENGLWIDGET
+  Q_INVOKABLE QVTKOpenGLWidget * VTKWidget() const;
+#else
   Q_INVOKABLE QVTKWidget * VTKWidget() const;
+#endif
 
   /// Get background color
   virtual QColor backgroundColor() const;

+ 6 - 1
Libs/Visualization/VTK/Widgets/ctkVTKAbstractView_p.h

@@ -30,8 +30,8 @@ class QTimer;
 #include "ctkVTKAbstractView.h"
 
 // VTK includes
-#include <QVTKWidget.h>
 #include <vtkCornerAnnotation.h>
+#include <vtkGenericOpenGLRenderWindow.h>
 #include <vtkRenderWindow.h>
 #include <vtkSmartPointer.h>
 #include <vtkWeakPointer.h>
@@ -57,8 +57,13 @@ public:
   QList<vtkRenderer*> renderers()const;
   vtkRenderer* firstRenderer()const;
 
+#if CTK_USE_QVTKOPENGLWIDGET
+  QVTKOpenGLWidget*                             VTKWidget;
+  vtkSmartPointer<vtkGenericOpenGLRenderWindow> RenderWindow;
+#else
   QVTKWidget*                                   VTKWidget;
   vtkSmartPointer<vtkRenderWindow>              RenderWindow;
+#endif
   QTimer*                                       RequestTimer;
   QTime                                         RequestTime;
   bool                                          RenderEnabled;

+ 11 - 0
Libs/Visualization/VTK/Widgets/ctkVTKChartView.cpp

@@ -33,6 +33,7 @@
 #include <vtkContextMouseEvent.h>
 #include <vtkContextScene.h>
 #include <vtkContextView.h>
+#include <vtkGenericOpenGLRenderWindow.h>
 #include <vtkOpenGLContextDevice2D.h>
 #include <vtkPlot.h>
 #include <vtkRenderWindow.h>
@@ -51,6 +52,9 @@ public:
   void init();
   void chartBounds(double* bounds)const;
 
+#if CTK_USE_QVTKOPENGLWIDGET
+  vtkSmartPointer<vtkGenericOpenGLRenderWindow> RenderWindow;
+#endif
   vtkSmartPointer<vtkContextView> ContextView;
   vtkSmartPointer<vtkChartXY> Chart;
   double UserBounds[8];
@@ -65,6 +69,9 @@ ctkVTKChartViewPrivate::ctkVTKChartViewPrivate(ctkVTKChartView& object)
   :q_ptr(&object)
 {
   this->ContextView = vtkSmartPointer<vtkContextView>::New();
+#if CTK_USE_QVTKOPENGLWIDGET
+  this->RenderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
+#endif
   this->Chart = vtkSmartPointer<vtkChartXY>::New();
   this->ContextView->GetScene()->AddItem(this->Chart);
   this->UserBounds[0] = this->UserBounds[2] = this->UserBounds[4] = this->UserBounds[6] = 0.;
@@ -77,6 +84,10 @@ ctkVTKChartViewPrivate::ctkVTKChartViewPrivate(ctkVTKChartView& object)
 void ctkVTKChartViewPrivate::init()
 {
   Q_Q(ctkVTKChartView);
+#if CTK_USE_QVTKOPENGLWIDGET
+  q->SetRenderWindow(this->RenderWindow);
+  this->ContextView->SetRenderWindow(this->RenderWindow);
+#endif
   this->ContextView->SetInteractor(q->GetInteractor());
   q->SetRenderWindow(this->ContextView->GetRenderWindow());
   // low def for now (faster)

+ 12 - 0
Libs/Visualization/VTK/Widgets/ctkVTKChartView.h

@@ -27,21 +27,33 @@
 class ctkVTKChartViewPrivate;
 
 // VTK includes
+#if CTK_USE_QVTKOPENGLWIDGET
+#include <QVTKOpenGLWidget.h>
+#else
 #include <QVTKWidget.h>
+#endif
 
 class vtkChartXY;
 class vtkContextScene;
 class vtkPlot;
 
 /// \ingroup Visualization_VTK_Widgets
+#if CTK_USE_QVTKOPENGLWIDGET
+class CTK_VISUALIZATION_VTK_WIDGETS_EXPORT ctkVTKChartView : public QVTKOpenGLWidget
+#else
 class CTK_VISUALIZATION_VTK_WIDGETS_EXPORT ctkVTKChartView : public QVTKWidget
+#endif
 {
   Q_OBJECT
   QVTK_OBJECT
   Q_PROPERTY(QString title READ title WRITE setTitle)
 
 public:
+#if CTK_USE_QVTKOPENGLWIDGET
+  typedef QVTKOpenGLWidget Superclass;
+#else
   typedef QVTKWidget Superclass;
+#endif
   ctkVTKChartView(QWidget* parent = 0);
   virtual ~ctkVTKChartView();
 

+ 65 - 0
Libs/Visualization/VTK/Widgets/ctkVTKMagnifyView.cpp

@@ -30,7 +30,11 @@
 #include "ctkLogger.h"
 
 // VTK includes
+#if CTK_USE_QVTKOPENGLWIDGET
+#include <QVTKOpenGLWidget.h>
+#else
 #include <QVTKWidget.h>
+#endif
 #include <vtkMath.h>
 #include <vtkRenderWindow.h>
 #include <vtkUnsignedCharArray.h>
@@ -49,7 +53,11 @@ static ctkLogger logger("org.commontk.visualization.vtk.widgets.ctkVTKMagnifyVie
 ctkVTKMagnifyViewPrivate::ctkVTKMagnifyViewPrivate(ctkVTKMagnifyView& object)
   : QObject(&object), q_ptr(&object)
 {
+#if CTK_USE_QVTKOPENGLWIDGET
+  this->ObservedQVTKWidgets = QList<QVTKOpenGLWidget *>();
+#else
   this->ObservedQVTKWidgets = QList<QVTKWidget *>();
+#endif
   this->Magnification = 1.0;
   this->ObserveRenderWindowEvents = true;
 
@@ -169,7 +177,11 @@ void ctkVTKMagnifyViewPrivate::pushRemovePixmapEvent()
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyViewPrivate::connectRenderWindow(QVTKOpenGLWidget * widget)
+#else
 void ctkVTKMagnifyViewPrivate::connectRenderWindow(QVTKWidget * widget)
+#endif
 {
   Q_ASSERT(widget);
   Q_ASSERT(this->ObserveRenderWindowEvents);
@@ -183,7 +195,11 @@ void ctkVTKMagnifyViewPrivate::connectRenderWindow(QVTKWidget * widget)
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyViewPrivate::disconnectRenderWindow(QVTKOpenGLWidget * widget)
+#else
 void ctkVTKMagnifyViewPrivate::disconnectRenderWindow(QVTKWidget * widget)
+#endif
 {
   Q_ASSERT(widget);
 
@@ -196,7 +212,11 @@ void ctkVTKMagnifyViewPrivate::disconnectRenderWindow(QVTKWidget * widget)
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyViewPrivate::observe(QVTKOpenGLWidget * widget)
+#else
 void ctkVTKMagnifyViewPrivate::observe(QVTKWidget * widget)
+#endif
 {
   Q_ASSERT(widget);
 
@@ -215,7 +235,11 @@ void ctkVTKMagnifyViewPrivate::observe(QVTKWidget * widget)
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyViewPrivate::remove(QVTKOpenGLWidget * widget)
+#else
 void ctkVTKMagnifyViewPrivate::remove(QVTKWidget * widget)
+#endif
 {
   Q_ASSERT(widget);
 
@@ -490,7 +514,11 @@ void ctkVTKMagnifyView::setObserveRenderWindowEvents(bool newObserve)
   // Connect/disconnect observations on vtkRenderWindow EndEvents, depending
   // on whether we are switching from not-observing to observing or from
   // observing to not-observing
+#if CTK_USE_QVTKOPENGLWIDGET
+  QList<QVTKOpenGLWidget *>::iterator it = d->ObservedQVTKWidgets.begin();
+#else
   QList<QVTKWidget *>::iterator it = d->ObservedQVTKWidgets.begin();
+#endif
   while (it != d->ObservedQVTKWidgets.end())
     {
     if (newObserve)
@@ -526,7 +554,11 @@ void ctkVTKMagnifyView::setUpdateInterval(int newInterval)
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyView::observe(QVTKOpenGLWidget * widget)
+#else
 void ctkVTKMagnifyView::observe(QVTKWidget * widget)
+#endif
 {
   Q_D(ctkVTKMagnifyView);
   if (widget)
@@ -536,16 +568,28 @@ void ctkVTKMagnifyView::observe(QVTKWidget * widget)
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyView::observe(QList<QVTKOpenGLWidget *> widgets)
+#else
 void ctkVTKMagnifyView::observe(QList<QVTKWidget *> widgets)
+#endif
 {
+#if CTK_USE_QVTKOPENGLWIDGET
+  foreach(QVTKOpenGLWidget * widget, widgets)
+#else
   foreach(QVTKWidget * widget, widgets)
+#endif
     {
     this->observe(widget);
     }
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+bool ctkVTKMagnifyView::isObserved(QVTKOpenGLWidget * widget) const
+#else
 bool ctkVTKMagnifyView::isObserved(QVTKWidget * widget) const
+#endif
 {
   if (!widget)
     {
@@ -568,7 +612,11 @@ bool ctkVTKMagnifyView::hasCursorInObservedWidget()const
   Q_D(const ctkVTKMagnifyView);
   // checking underMouse is faster than 
   // QApplication::widgetAt(QCursor::pos())
+#if CTK_USE_QVTKOPENGLWIDGET
+  foreach(const QVTKOpenGLWidget* widget, d->ObservedQVTKWidgets)
+#else
   foreach(const QVTKWidget* widget, d->ObservedQVTKWidgets)
+#endif
     {
     if (widget->underMouse())
       {
@@ -579,7 +627,11 @@ bool ctkVTKMagnifyView::hasCursorInObservedWidget()const
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyView::remove(QVTKOpenGLWidget * widget)
+#else
 void ctkVTKMagnifyView::remove(QVTKWidget * widget)
+#endif
 {
   Q_D(ctkVTKMagnifyView);
   if (widget)
@@ -589,9 +641,17 @@ void ctkVTKMagnifyView::remove(QVTKWidget * widget)
 }
 
 // --------------------------------------------------------------------------
+#if CTK_USE_QVTKOPENGLWIDGET
+void ctkVTKMagnifyView::remove(QList<QVTKOpenGLWidget *> widgets)
+#else
 void ctkVTKMagnifyView::remove(QList<QVTKWidget *> widgets)
+#endif
 {
+#if CTK_USE_QVTKOPENGLWIDGET
+  foreach(QVTKOpenGLWidget * widget, widgets)
+#else
   foreach(QVTKWidget * widget, widgets)
+#endif
     {
     this->remove(widget);
     }
@@ -600,8 +660,13 @@ void ctkVTKMagnifyView::remove(QList<QVTKWidget *> widgets)
 // --------------------------------------------------------------------------
 bool ctkVTKMagnifyView::eventFilter(QObject * obj, QEvent * event)
 {
+#if CTK_USE_QVTKOPENGLWIDGET
+  // The given object should be a QVTKWidget in our list
+  QVTKOpenGLWidget * widget = static_cast<QVTKOpenGLWidget *>(obj);
+#else
   // The given object should be a QVTKWidget in our list
   QVTKWidget * widget = static_cast<QVTKWidget *>(obj);
+#endif
   Q_ASSERT(widget);
   Q_D(ctkVTKMagnifyView);
   Q_ASSERT(d->ObservedQVTKWidgets.contains(widget));

+ 29 - 0
Libs/Visualization/VTK/Widgets/ctkVTKMagnifyView.h

@@ -29,7 +29,11 @@
 #include "ctkVisualizationVTKWidgetsExport.h"
 
 // VTK includes
+#if CTK_USE_QVTKOPENGLWIDGET
+class QVTKOpenGLWidget;
+#else
 class QVTKWidget;
+#endif
 
 class ctkVTKMagnifyViewPrivate;
 
@@ -75,25 +79,45 @@ public:
   /// Add a QVTKWidget to observe mouse events on.  You can call this function
   /// multiple times to observe multiple QVTKWidgets.
   /// \sa observe
+#if CTK_USE_QVTKOPENGLWIDGET
+  void observe(QVTKOpenGLWidget * widget);
+#else
   void observe(QVTKWidget * widget);
+#endif
 
   /// Add multiple QVTKWidgets at once to observe mouse events on.  You can
   /// call this function multiple times to observe multiple QVTKWidgets.
   /// \sa observe
+#if CTK_USE_QVTKOPENGLWIDGET
+  void observe(QList<QVTKOpenGLWidget *> widgets);
+#else
   void observe(QList<QVTKWidget *> widgets);
+#endif
 
   /// Remove a QVTKWidget to observe mouse events on.  You can call this
   /// function multiple times to remove multiple QVTKWidgets.
   /// \sa remove
+#if CTK_USE_QVTKOPENGLWIDGET
+  void remove(QVTKOpenGLWidget * widget);
+#else
   void remove(QVTKWidget * widget);
+#endif
 
   /// Remove multiple QVTKWidgets at once to observe mouse events on.  You can
   /// call this function multiple times to remove multiple QVTKWidgets.
   /// \sa unobserve
+#if CTK_USE_QVTKOPENGLWIDGET
+  void remove(QList<QVTKOpenGLWidget *> widgets);
+#else
   void remove(QList<QVTKWidget *> widgets);
+#endif
 
   /// Returns whether a QVTKWidget is observed
+#if CTK_USE_QVTKOPENGLWIDGET
+  bool isObserved(QVTKOpenGLWidget * widget) const;
+#else
   bool isObserved(QVTKWidget * widget) const;
+#endif
 
   /// Returns the number of observed QVTKWidgets
   int numberObserved()const;
@@ -109,8 +133,13 @@ protected:
   virtual bool eventFilter(QObject *obj, QEvent *event);
 
 Q_SIGNALS:
+#if CTK_USE_QVTKOPENGLWIDGET
+  void enteredObservedWidget(QVTKOpenGLWidget * widget);
+  void leftObservedWidget(QVTKOpenGLWidget * widget);
+#else
   void enteredObservedWidget(QVTKWidget * widget);
   void leftObservedWidget(QVTKWidget * widget);
+#endif
 
 private:
   Q_DECLARE_PRIVATE(ctkVTKMagnifyView)

+ 15 - 3
Libs/Visualization/VTK/Widgets/ctkVTKMagnifyView_p.h

@@ -30,9 +30,6 @@ class QTimerEvent;
 #include "ctkVTKMagnifyView.h"
 #include <ctkVTKObject.h>
 
-// VTK includes
-class QVTKWidget;
-
 /// \ingroup Visualization_VTK_Widgets
 class ctkVTKMagnifyViewPrivate : public QObject
 {
@@ -46,10 +43,17 @@ public:
   virtual ~ctkVTKMagnifyViewPrivate();
 
   void init();
+#if CTK_USE_QVTKOPENGLWIDGET
+  void observe(QVTKOpenGLWidget * widget);
+  void remove(QVTKOpenGLWidget * widget);
+  void connectRenderWindow(QVTKOpenGLWidget * widget);
+  void disconnectRenderWindow(QVTKOpenGLWidget * widget);
+#else
   void observe(QVTKWidget * widget);
   void remove(QVTKWidget * widget);
   void connectRenderWindow(QVTKWidget * widget);
   void disconnectRenderWindow(QVTKWidget * widget);
+#endif
 
 protected:
   void updatePixmap();
@@ -67,7 +71,11 @@ protected:
   struct EventHandlerStruct
     {
     PendingEventType EventType;
+#if CTK_USE_QVTKOPENGLWIDGET
+    QPointer<QVTKOpenGLWidget> Widget;
+#else
     QPointer<QVTKWidget> Widget;
+#endif
     QPointF Position;
     int UpdateInterval;
     int TimerId;
@@ -79,7 +87,11 @@ public Q_SLOTS:
   void pushRemovePixmapEvent();
 
 public:
+#if CTK_USE_QVTKOPENGLWIDGET
+  QList<QVTKOpenGLWidget *> ObservedQVTKWidgets;
+#else
   QList<QVTKWidget *> ObservedQVTKWidgets;
+#endif
   double Magnification;
   bool ObserveRenderWindowEvents;
   EventHandlerStruct EventHandler;

+ 0 - 1
Libs/Visualization/VTK/Widgets/ctkVTKRenderView_p.h

@@ -31,7 +31,6 @@
 #include "ctkVTKRenderView.h"
 
 // VTK includes
-#include <QVTKWidget.h>
 #include <vtkAxesActor.h>
 #include <vtkCornerAnnotation.h>
 #include <vtkOrientationMarkerWidget.h>

+ 0 - 1
Libs/Visualization/VTK/Widgets/ctkVTKScalarsToColorsView.h

@@ -27,7 +27,6 @@
 class ctkVTKScalarsToColorsViewPrivate;
 
 // VTK includes
-#include <QVTKWidget.h>
 #include <vtkChartXY.h>
 
 class vtkColorTransferFunction;

+ 12 - 0
Libs/Visualization/VTK/Widgets/ctkVTKWidgetsUtils.cpp

@@ -28,7 +28,11 @@
 #include "ctkWidgetsUtils.h"
 
 // VTK includes
+#if CTK_USE_QVTKOPENGLWIDGET
+#include <QVTKOpenGLWidget.h>
+#else
 #include <QVTKWidget.h>
+#endif
 #include <vtkImageData.h>
 #include <vtkVersion.h>
 
@@ -46,7 +50,11 @@ QImage ctk::grabVTKWidget(QWidget* widget, QRect rectangle)
   QImage widgetImage = ctk::grabWidget(widget, rectangle);
   QPainter painter;
   painter.begin(&widgetImage);
+#if CTK_USE_QVTKOPENGLWIDGET
+  foreach(QVTKOpenGLWidget* vtkWidget, widget->findChildren<QVTKOpenGLWidget*>())
+#else
   foreach(QVTKWidget* vtkWidget, widget->findChildren<QVTKWidget*>())
+#endif
     {
     if (!vtkWidget->isVisible())
       {
@@ -57,9 +65,13 @@ QImage ctk::grabVTKWidget(QWidget* widget, QRect rectangle)
       {
       continue;
       }
+#if CTK_USE_QVTKOPENGLWIDGET
+    QImage subImage = vtkWidget->grabFramebuffer();
+#else
     vtkImageData* imageData = vtkWidget->cachedImage();
     /// \todo retrieve just the rectangle.intersected(
     QImage subImage = ctk::vtkImageDataToQImage(imageData);
+#endif
     painter.drawImage(subWidgetRect, subImage);
     }
   painter.end();

+ 8 - 0
Libs/Widgets/Testing/Cpp/ctkWidgetsUtilsTestGrabWidget.cpp

@@ -22,7 +22,11 @@
 #include <QApplication>
 #include <QDialog>
 #include <QFrame>
+#if QT_VERSION < QT_VERSION_CHECK(5,4,0)
 #include <QGLWidget>
+#else
+#include <QOpenGLWidget>
+#endif
 #include <QTimer>
 #include <QVBoxLayout>
 
@@ -42,7 +46,11 @@ int ctkWidgetsUtilsTestGrabWidget(int argc, char * argv [] )
   parentWidget.setFrameStyle(QFrame::Panel | QFrame::Raised);
   parentWidget.setLineWidth(2);
 
+#if QT_VERSION < QT_VERSION_CHECK(5,4,0)
   QGLWidget glWidget(&parentWidget);
+#else
+  QOpenGLWidget glWidget(&parentWidget);
+#endif
   QVBoxLayout* layout = new QVBoxLayout(&parentWidget);
   layout->addWidget(&glWidget);
   parentWidget.setLayout(layout);