You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
7.2 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: QVTKOpenGLWindow.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class QVTKOpenGLWindow
* @brief display a vtkGenericOpenGLRenderWindow in a Qt QOpenGLWindow.
*
* QVTKOpenGLWindow is one of the mechanisms for displaying VTK rendering
* results in a Qt application. QVTKOpenGLWindow extends QOpenGLWindow to
* display the rendering results of a vtkGenericOpenGLRenderWindow.
*
* Since QVTKOpenGLWindow is based on QOpenGLWindow it is intended for
* rendering in a top-level window. QVTKOpenGLWindow can be embedded in a
* another QWidget using `QWidget::createWindowContainer` or by using
* QVTKOpenGLStereoWidget instead. However, developers are encouraged to check
* Qt documentation for `QWidget::createWindowContainer` idiosyncrasies.
* Using QVTKOpenGLNativeWidget instead is generally a better choice for causes
* where you want to embed VTK rendering results in a QWidget. QVTKOpenGLWindow
* or QVTKOpenGLStereoWidget is still preferred for applications that want to support
* quad-buffer based stereo rendering.
*
* To request a specific configuration for the context, use
* `QWindow::setFormat()` like for any other QWindow. This allows, among others,
* requesting a given OpenGL version and profile. Use
* `QOpenGLWindow::defaultFormat()` to obtain a QSurfaceFormat with appropriate
* OpenGL version configuration. To enable quad-buffer stereo, you'll need to
* call `QSurfaceFormat::setStereo(true)`.
*
* VTK Rendering features like multi-sampling, double buffering etc.
* are enabled/disabled by directly setting the corresponding attributes on
* vtkGenericOpenGLRenderWindow and not when specifying the OpenGL context
* format in `setFormat`. If not specified, then `QSurfaceFormat::defaultFormat`
* will be used.
*
* @note QVTKOpenGLWindow requires Qt version 5.9 and above.
* @sa QVTKOpenGLStereoWidget QVTKOpenGLNativeWidget
*/
#ifndef QVTKOpenGLWindow_h
#define QVTKOpenGLWindow_h
#include <QOpenGLWindow>
#include <QScopedPointer> // for QScopedPointer.
#include "QVTKInteractor.h" // needed for QVTKInteractor
#include "vtkGUISupportQtModule.h" // for export macro
#include "vtkNew.h" // needed for vtkNew
#include "vtkSmartPointer.h" // needed for vtkSmartPointer
class QVTKInteractor;
class QVTKInteractorAdapter;
class QVTKRenderWindowAdapter;
class vtkGenericOpenGLRenderWindow;
class VTKGUISUPPORTQT_EXPORT QVTKOpenGLWindow : public QOpenGLWindow
{
Q_OBJECT
typedef QOpenGLWindow Superclass;
public:
QVTKOpenGLWindow(
QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow* parent = nullptr);
QVTKOpenGLWindow(QOpenGLContext* shareContext,
QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow* parent = nullptr);
QVTKOpenGLWindow(vtkGenericOpenGLRenderWindow* renderWindow,
QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow* parent = nullptr);
QVTKOpenGLWindow(vtkGenericOpenGLRenderWindow* renderWindow, QOpenGLContext* shareContext,
QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow* parent = nullptr);
~QVTKOpenGLWindow() override;
//@{
/**
* Set a render window to use. It a render window was already set, it will be
* finalized and all of its OpenGL resource released. If the \c win is
* non-null and it has no interactor set, then a QVTKInteractor instance will
* be created as set on the render window as the interactor.
*/
void setRenderWindow(vtkGenericOpenGLRenderWindow* win);
void setRenderWindow(vtkRenderWindow* win);
//@}
/**
* Returns the render window that is being shown in this widget.
*/
vtkRenderWindow* renderWindow() const;
/**
* Get the QVTKInteractor that was either created by default or set by the user.
*/
QVTKInteractor* interactor() const;
/**
* @copydoc QVTKRenderWindowAdapter::defaultFormat(bool)
*/
static QSurfaceFormat defaultFormat(bool stereo_capable = false);
//@{
/**
* Enable or disable support for HiDPI displays. When enabled, this enabled
* DPI scaling i.e. `vtkWindow::SetDPI` will be called with a DPI value scaled
* by the device pixel ratio every time the widget is resized. The unscaled
* DPI value can be specified by using `setUnscaledDPI`.
*/
void setEnableHiDPI(bool enable);
bool enableHiDPI() const { return this->EnableHiDPI; }
//@}
//@{
/**
* Set/Get unscaled DPI value. Defaults to 72, which is also the default value
* in vtkWindow.
*/
void setUnscaledDPI(int);
int unscaledDPI() const { return this->UnscaledDPI; }
//@}
//@{
/**
* Set/get the default cursor to use for this widget.
*/
void setDefaultCursor(const QCursor& cursor);
const QCursor& defaultCursor() const { return this->DefaultCursor; }
//@}
//@{
/**
* @deprecated in VTK 9.0. Use `setRenderWindow` instead.
*/
VTK_LEGACY(void SetRenderWindow(vtkGenericOpenGLRenderWindow* win));
VTK_LEGACY(void SetRenderWindow(vtkRenderWindow* win));
//@}
//@{
/**
* These methods have be deprecated to fix naming style. Since
* QVTKOpenGLWindow is QObject subclass, we follow Qt naming conventions
* rather than VTK's.
*/
VTK_LEGACY(vtkRenderWindow* GetRenderWindow());
VTK_LEGACY(QVTKInteractor* GetInteractor());
//@}
/**
* @deprecated in VTK 9.0
* QVTKInteractorAdapter is an internal helper. Hence the API was removed.
*/
VTK_LEGACY(QVTKInteractorAdapter* GetInteractorAdapter());
/**
* @deprecated in VTK 9.0. Simply use `QWidget::setCursor` API to change
* cursor.
*/
VTK_LEGACY(void setQVTKCursor(const QCursor& cursor));
/**
* @deprecated in VTK 9.0. Use `setDefaultCursor` instead.
*/
VTK_LEGACY(void setDefaultQVTKCursor(const QCursor& cursor));
signals:
/**
* Signal emitted when any event has been receive, with the corresponding
* event as argument.
*/
void windowEvent(QEvent* e);
protected slots:
/**
* Called as a response to `QOpenGLContext::aboutToBeDestroyed`. This may be
* called anytime during the widget lifecycle. We need to release any OpenGL
* resources allocated in VTK work in this method.
*/
void cleanupContext();
void updateSize();
/**
* QVTKOpenGLStereoWidget is given friendship so it can call `cleanupContext` in its
* destructor to ensure that OpenGL state is proporly cleaned up before the
* widget goes away.
*/
friend class QVTKOpenGLStereoWidget;
protected:
bool event(QEvent* evt) override;
void initializeGL() override;
void paintGL() override;
void resizeGL(int w, int h) override;
protected:
vtkSmartPointer<vtkGenericOpenGLRenderWindow> RenderWindow;
QScopedPointer<QVTKRenderWindowAdapter> RenderWindowAdapter;
private:
Q_DISABLE_COPY(QVTKOpenGLWindow);
bool EnableHiDPI;
int UnscaledDPI;
QCursor DefaultCursor;
};
#endif