diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-11-04 13:40:09 +0200 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-11-04 13:46:52 +0200 |
commit | 0d5caf7904098186e50009627996191dc7f8687b (patch) | |
tree | abff5454cd8839e77f6e9484f92556bb733f3cb1 | |
parent | 9cb3cf372155e2a57c15e4044a3684694ff1b1bd (diff) |
Surface toggling API implemented
Task-number: QTRD-2337
Change-Id: I59695a042c864faed90839c4e566fcece5cb94f4
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
-rw-r--r-- | examples/qmlsurface/qml/qmlsurface/main.qml | 18 | ||||
-rw-r--r-- | src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.cpp | 14 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.h | 4 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3dcontroller.cpp | 18 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3dcontroller_p.h | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 125 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativesurface.cpp | 10 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativesurface_p.h | 11 | ||||
-rw-r--r-- | tests/surfacetest/graphmodifier.cpp | 6 | ||||
-rw-r--r-- | tests/surfacetest/graphmodifier.h | 1 | ||||
-rw-r--r-- | tests/surfacetest/main.cpp | 7 |
13 files changed, 168 insertions, 60 deletions
diff --git a/examples/qmlsurface/qml/qmlsurface/main.qml b/examples/qmlsurface/qml/qmlsurface/main.qml index ab266c56..600d75c1 100644 --- a/examples/qmlsurface/qml/qmlsurface/main.qml +++ b/examples/qmlsurface/qml/qmlsurface/main.qml @@ -104,9 +104,25 @@ Item { } NewButton { - id: smoothSurfaceToggle + id: surfaceToggle anchors.top: surfaceGridToggle.bottom width: surfaceGridToggle.width + text: "Hide Surface" + onClicked: { + if (surfaceplot.surfaceVisible === true) { + surfaceplot.surfaceVisible = false; + text = "Show Surface" + } else { + surfaceplot.surfaceVisible = true; + text = "Hide Surface" + } + } + } + + NewButton { + id: smoothSurfaceToggle + anchors.top: surfaceToggle.bottom + width: surfaceToggle.width text: "Show Flat" //! [2] onClicked: { diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc index 92b0e7d9..55a0d1d1 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc @@ -80,6 +80,12 @@ */ /*! + * \qmlproperty bool Surface3D::surfaceVisible + * The surface visibility. If false, no surface is drawn. If surface grid is enabled, it is still + * drawn. + */ + +/*! \qmlproperty bool Surface3D::surfaceGridEnabled The surface grid visibility. If false, no surface grid is drawn. */ diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index 7b9e32bb..a91df086 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -276,6 +276,20 @@ QDataVis::SelectionFlags Q3DSurface::selectionMode() const return d_ptr->m_shared->selectionMode(); } +/*! + * \property Q3DSurface::surfaceVisible + * + * Sets surface to \a visible. It is preset to \c true by default. + */ +void Q3DSurface::setSurfaceVisible(bool visible) +{ + d_ptr->m_shared->setSurfaceVisible(visible); +} + +bool Q3DSurface::isSurfaceVisible() const +{ + return d_ptr->m_shared->surfaceVisible(); +} /*! * \property Q3DSurface::surfaceGridEnabled diff --git a/src/datavisualization/engine/q3dsurface.h b/src/datavisualization/engine/q3dsurface.h index c131f245..ca3c3965 100644 --- a/src/datavisualization/engine/q3dsurface.h +++ b/src/datavisualization/engine/q3dsurface.h @@ -38,6 +38,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DSurface : public Q3DWindow Q_PROPERTY(QtDataVisualization::QDataVis::LabelStyle labelStyle READ labelStyle WRITE setLabelStyle) Q_PROPERTY(QtDataVisualization::QDataVis::Theme theme READ theme WRITE setTheme) Q_PROPERTY(QtDataVisualization::QDataVis::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality) + Q_PROPERTY(bool surfaceVisible READ isSurfaceVisible WRITE setSurfaceVisible) Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible) Q_PROPERTY(bool backgroundVisible READ isBackgroundVisible WRITE setBackgroundVisible) Q_PROPERTY(bool smoothSurfaceEnabled READ isSmoothSurfaceEnabled WRITE setSmoothSurfaceEnabled) @@ -52,6 +53,9 @@ public: explicit Q3DSurface(); ~Q3DSurface(); + void setSurfaceVisible(bool visible); + bool isSurfaceVisible() const; + void setGridVisible(bool visible); bool isGridVisible() const; diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index ec1cae30..04943bf9 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -34,6 +34,7 @@ Surface3DController::Surface3DController(QRect rect) : Abstract3DController(rect), m_renderer(0), m_isSmoothSurfaceEnabled(false), + m_isSurfaceEnabled(true), m_isSurfaceGridEnabled(true), m_selectedPoint(noSelectionPoint()) { @@ -91,6 +92,11 @@ void Surface3DController::synchDataToRenderer() emit smoothSurfaceEnabledChanged(m_isSmoothSurfaceEnabled); } + if (m_changeTracker.surfaceVisibilityChanged) { + m_renderer->updateSurfaceVisibilityStatus(m_isSurfaceEnabled); + m_changeTracker.surfaceVisibilityChanged = false; + } + if (m_changeTracker.surfaceGridChanged) { m_renderer->updateSurfaceGridStatus(m_isSurfaceGridEnabled); m_changeTracker.surfaceGridChanged = false; @@ -145,6 +151,18 @@ bool Surface3DController::smoothSurface() return m_isSmoothSurfaceEnabled; } +void Surface3DController::setSurfaceVisible(bool visible) +{ + m_isSurfaceEnabled = visible; + m_changeTracker.surfaceVisibilityChanged = true; + emitNeedRender(); +} + +bool Surface3DController::surfaceVisible() const +{ + return m_isSurfaceEnabled; +} + void Surface3DController::setSurfaceGrid(bool enable) { m_isSurfaceGridEnabled = enable; diff --git a/src/datavisualization/engine/surface3dcontroller_p.h b/src/datavisualization/engine/surface3dcontroller_p.h index 83a52b7d..1010f09b 100644 --- a/src/datavisualization/engine/surface3dcontroller_p.h +++ b/src/datavisualization/engine/surface3dcontroller_p.h @@ -41,12 +41,14 @@ class Surface3DRenderer; struct Surface3DChangeBitField { bool gradientColorChanged : 1; bool smoothStatusChanged : 1; + bool surfaceVisibilityChanged : 1; bool surfaceGridChanged : 1; bool selectedPointChanged : 1; Surface3DChangeBitField() : gradientColorChanged(true), smoothStatusChanged(true), + surfaceVisibilityChanged(true), surfaceGridChanged(true), selectedPointChanged(true) { @@ -61,6 +63,7 @@ private: Surface3DChangeBitField m_changeTracker; Surface3DRenderer *m_renderer; bool m_isSmoothSurfaceEnabled; + bool m_isSurfaceEnabled; bool m_isSurfaceGridEnabled; QLinearGradient m_userDefinedGradient; QPoint m_selectedPoint; @@ -72,6 +75,9 @@ public: void initializeOpenGL(); virtual void synchDataToRenderer(); + void setSurfaceVisible(bool visible); + bool surfaceVisible() const; + void setSmoothSurface(bool enable); bool smoothSurface(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 063ddd7e..92a68461 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -102,6 +102,8 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_shadowQualityToShader(33.3f), m_cachedSmoothSurface(true), m_flatSupported(true), + m_cachedSurfaceOn(true), + m_cachedSurfaceGridOn(true), m_selectionPointer(0), m_selectionActive(false), m_xFlipped(false), @@ -506,16 +508,8 @@ void Surface3DRenderer::drawSlicedScene() } if (m_surfaceObj) { - ShaderHelper *surfaceShader = m_shader; - surfaceShader->bind(); - - if (m_cachedSurfaceGridOn) { - glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(0.5f, 1.0f); - } - - QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; + QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; modelMatrix.translate(offset, 0.0f, 0.0f); @@ -525,27 +519,37 @@ void Surface3DRenderer::drawSlicedScene() MVPMatrix = projectionViewMatrix * modelMatrix; - QVector3D color; - if (rowMode) - color = Utils::vectorFromColor(m_cachedTheme.m_highlightRowColor); - else - color = Utils::vectorFromColor(m_cachedTheme.m_highlightColumnColor); - - // Set shader bindings - surfaceShader->setUniformValue(surfaceShader->lightP(), lightPos); - surfaceShader->setUniformValue(surfaceShader->view(), viewMatrix); - surfaceShader->setUniformValue(surfaceShader->model(), modelMatrix); - surfaceShader->setUniformValue(surfaceShader->nModel(), - itModelMatrix.inverted().transposed()); - surfaceShader->setUniformValue(surfaceShader->MVP(), MVPMatrix); - surfaceShader->setUniformValue(surfaceShader->color(), color); - surfaceShader->setUniformValue(surfaceShader->lightS(), 0.25f); - surfaceShader->setUniformValue(surfaceShader->ambientS(), - m_cachedTheme.m_ambientStrength * 2.0f); + if (m_cachedSurfaceOn) { + if (m_cachedSurfaceGridOn) { + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(0.5f, 1.0f); + } - m_drawer->drawObject(surfaceShader, m_sliceSurfaceObj); + ShaderHelper *surfaceShader = m_shader; + surfaceShader->bind(); - surfaceShader->release(); + QVector3D color; + if (rowMode) + color = Utils::vectorFromColor(m_cachedTheme.m_highlightRowColor); + else + color = Utils::vectorFromColor(m_cachedTheme.m_highlightColumnColor); + + // Set shader bindings + surfaceShader->setUniformValue(surfaceShader->lightP(), lightPos); + surfaceShader->setUniformValue(surfaceShader->view(), viewMatrix); + surfaceShader->setUniformValue(surfaceShader->model(), modelMatrix); + surfaceShader->setUniformValue(surfaceShader->nModel(), + itModelMatrix.inverted().transposed()); + surfaceShader->setUniformValue(surfaceShader->MVP(), MVPMatrix); + surfaceShader->setUniformValue(surfaceShader->color(), color); + surfaceShader->setUniformValue(surfaceShader->lightS(), 0.25f); + surfaceShader->setUniformValue(surfaceShader->ambientS(), + m_cachedTheme.m_ambientStrength * 2.0f); + + m_drawer->drawObject(surfaceShader, m_sliceSurfaceObj); + + surfaceShader->release(); + } // Draw surface grid if (m_cachedSurfaceGridOn) { @@ -787,7 +791,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Draw depth buffer #if !defined(QT_OPENGL_ES_2) GLfloat adjustedLightStrength = m_cachedTheme.m_lightStrength / 10.0f; - if (m_cachedShadowQuality > QDataVis::ShadowQualityNone && m_surfaceObj) { + if (m_cachedShadowQuality > QDataVis::ShadowQualityNone && m_surfaceObj && m_cachedSurfaceOn) { // Render scene into a depth texture for using with shadow mapping // Enable drawing to depth framebuffer glBindFramebuffer(GL_FRAMEBUFFER, m_depthFrameBuffer); @@ -939,7 +943,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Draw the surface if (m_surfaceObj && m_sampleSpace.width() >= 2 && m_sampleSpace.height() >= 2) { m_surfaceShader->bind(); - // For surface we can see climpses from underneath glDisable(GL_CULL_FACE); if (m_cachedSurfaceGridOn) { @@ -960,40 +963,43 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) #else MVPMatrix = projectionViewMatrix * modelMatrix; #endif - // Set shader bindings - m_surfaceShader->setUniformValue(m_surfaceShader->lightP(), lightPos); - m_surfaceShader->setUniformValue(m_surfaceShader->view(), viewMatrix); - m_surfaceShader->setUniformValue(m_surfaceShader->model(), modelMatrix); - m_surfaceShader->setUniformValue(m_surfaceShader->nModel(), - itModelMatrix.inverted().transposed()); - m_surfaceShader->setUniformValue(m_surfaceShader->MVP(), MVPMatrix); - m_surfaceShader->setUniformValue(m_surfaceShader->ambientS(), - m_cachedTheme.m_ambientStrength); + + if (m_cachedSurfaceOn) { + // Set shader bindings + m_surfaceShader->setUniformValue(m_surfaceShader->lightP(), lightPos); + m_surfaceShader->setUniformValue(m_surfaceShader->view(), viewMatrix); + m_surfaceShader->setUniformValue(m_surfaceShader->model(), modelMatrix); + m_surfaceShader->setUniformValue(m_surfaceShader->nModel(), + itModelMatrix.inverted().transposed()); + m_surfaceShader->setUniformValue(m_surfaceShader->MVP(), MVPMatrix); + m_surfaceShader->setUniformValue(m_surfaceShader->ambientS(), + m_cachedTheme.m_ambientStrength); #if !defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) { - // Set shadow shader bindings - QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; - m_surfaceShader->setUniformValue(m_surfaceShader->shadowQ(), m_shadowQualityToShader); - m_surfaceShader->setUniformValue(m_surfaceShader->depth(), depthMVPMatrix); - m_surfaceShader->setUniformValue(m_surfaceShader->lightS(), adjustedLightStrength); + if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) { + // Set shadow shader bindings + QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; + m_surfaceShader->setUniformValue(m_surfaceShader->shadowQ(), m_shadowQualityToShader); + m_surfaceShader->setUniformValue(m_surfaceShader->depth(), depthMVPMatrix); + m_surfaceShader->setUniformValue(m_surfaceShader->lightS(), adjustedLightStrength); - // Draw the object - m_drawer->drawObject(m_surfaceShader, m_surfaceObj, m_gradientTexture, m_depthTexture); - } else + // Draw the object + m_drawer->drawObject(m_surfaceShader, m_surfaceObj, m_gradientTexture, m_depthTexture); + } else #endif - { - // Set shadowless shader bindings - m_surfaceShader->setUniformValue(m_surfaceShader->lightS(), - m_cachedTheme.m_lightStrength); + { + // Set shadowless shader bindings + m_surfaceShader->setUniformValue(m_surfaceShader->lightS(), + m_cachedTheme.m_lightStrength); - // Draw the object - m_drawer->drawObject(m_surfaceShader, m_surfaceObj, m_gradientTexture); - } + // Draw the object + m_drawer->drawObject(m_surfaceShader, m_surfaceObj, m_gradientTexture); + } - m_surfaceShader->release(); + m_surfaceShader->release(); - glEnable(GL_CULL_FACE); + glEnable(GL_CULL_FACE); + } // Draw surface grid if (m_cachedSurfaceGridOn) { @@ -1772,6 +1778,11 @@ void Surface3DRenderer::updateSelectedPoint(const QPoint &position) m_selectionDirty = true; } +void Surface3DRenderer::updateSurfaceVisibilityStatus(bool visible) +{ + m_cachedSurfaceOn = visible; +} + void Surface3DRenderer::updateSurfaceGridStatus(bool enable) { m_cachedSurfaceGridOn = enable; diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 54257cde..875e79c6 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -110,6 +110,7 @@ private: GLfloat m_shadowQualityToShader; bool m_cachedSmoothSurface; bool m_flatSupported; + bool m_cachedSurfaceOn; bool m_cachedSurfaceGridOn; SelectionPointer *m_selectionPointer; bool m_selectionActive; @@ -134,6 +135,7 @@ public: void updateScene(Q3DScene *scene); void updateInputState(QDataVis::InputState state); bool updateSmoothStatus(bool enable); + void updateSurfaceVisibilityStatus(bool visible); void updateSurfaceGridStatus(bool enable); void updateSurfaceGradient(const QLinearGradient &gradient); void updateSlicingActive(bool isSlicing); diff --git a/src/datavisualizationqml2/declarativesurface.cpp b/src/datavisualizationqml2/declarativesurface.cpp index a4cf1195..e898bd40 100644 --- a/src/datavisualizationqml2/declarativesurface.cpp +++ b/src/datavisualizationqml2/declarativesurface.cpp @@ -135,6 +135,16 @@ bool DeclarativeSurface::isSmoothSurfaceEnabled() const return m_shared->smoothSurface(); } +void DeclarativeSurface::setSurfaceVisible(bool visible) +{ + m_shared->setSurfaceVisible(visible); +} + +bool DeclarativeSurface::isSurfaceVisible() const +{ + return m_shared->surfaceVisible(); +} + void DeclarativeSurface::setSurfaceGridEnabled(bool enabled) { m_shared->setSurfaceGrid(enabled); diff --git a/src/datavisualizationqml2/declarativesurface_p.h b/src/datavisualizationqml2/declarativesurface_p.h index 3d911f43..5a2fdb94 100644 --- a/src/datavisualizationqml2/declarativesurface_p.h +++ b/src/datavisualizationqml2/declarativesurface_p.h @@ -51,9 +51,10 @@ class DeclarativeSurface : public AbstractDeclarative Q_PROPERTY(Q3DValueAxis *axisX READ axisX WRITE setAxisX) Q_PROPERTY(Q3DValueAxis *axisY READ axisY WRITE setAxisY) Q_PROPERTY(Q3DValueAxis *axisZ READ axisZ WRITE setAxisZ) + Q_PROPERTY(bool surfaceVisible READ isSurfaceVisible WRITE setSurfaceVisible NOTIFY surfaceVisibleChanged) Q_PROPERTY(bool smoothSurfaceEnabled READ isSmoothSurfaceEnabled WRITE setSmoothSurfaceEnabled NOTIFY smoothSurfaceEnabledChanged) - Q_PROPERTY(bool surfaceGridEnabled READ isSurfaceGridEnabled WRITE setSurfaceGridEnabled) - Q_PROPERTY(ColorGradient *gradient READ gradient WRITE setGradient) + Q_PROPERTY(bool surfaceGridEnabled READ isSurfaceGridEnabled WRITE setSurfaceGridEnabled NOTIFY surfaceGridEnabledChanged) + Q_PROPERTY(ColorGradient *gradient READ gradient WRITE setGradient NOTIFY gradientChanged) Q_PROPERTY(QPointF selectedPoint READ selectedPoint WRITE setSelectedPoint NOTIFY selectedPointChanged) public: @@ -70,6 +71,9 @@ public: Q3DValueAxis *axisZ() const; void setAxisZ(Q3DValueAxis *axis); + void setSurfaceVisible(bool visible); + bool isSurfaceVisible() const; + void setSmoothSurfaceEnabled(bool enabled); bool isSmoothSurfaceEnabled() const; @@ -83,7 +87,10 @@ public: QPointF selectedPoint() const; signals: + void surfaceVisibleChanged(bool visible); void smoothSurfaceEnabledChanged(bool enabled); + void surfaceGridEnabledChanged(bool visible); + void gradientChanged(ColorGradient *gradient); void selectedPointChanged(QPoint position); protected: diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index bd6ec920..ebc712a8 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -76,6 +76,12 @@ void GraphModifier::toggleSurfaceGrid(bool enable) m_graph->setSurfaceGridEnabled(enable); } +void GraphModifier::toggleSurface(bool enable) +{ + qDebug() << "GraphModifier::toggleSurface" << enable; + m_graph->setSurfaceVisible(enable); +} + void GraphModifier::toggleSqrtSin(bool enable) { if (enable) { diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index ed94b372..48b3e8ec 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -42,6 +42,7 @@ public: void toggleSmooth(bool enabled); void toggleSurfaceGrid(bool enable); + void toggleSurface(bool enable); void toggleSqrtSin(bool enable); void togglePlane(bool enable); void setHeightMapData(bool enable); diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index e4283b3e..78e7badb 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -70,6 +70,10 @@ int main(int argc, char *argv[]) surfaceGridCB->setText(QStringLiteral("Surface Grid")); surfaceGridCB->setChecked(true); + QCheckBox *surfaceCB = new QCheckBox(widget); + surfaceCB->setText(QStringLiteral("Surface Visible")); + surfaceCB->setChecked(true); + //QCheckBox *sqrtSinCB = new QCheckBox(widget); QRadioButton *sqrtSinCB = new QRadioButton(widget); sqrtSinCB->setText(QStringLiteral("Sqrt & Sin")); @@ -201,6 +205,7 @@ int main(int argc, char *argv[]) // Add controls to the layout vLayout->addWidget(smoothCB); vLayout->addWidget(surfaceGridCB); + vLayout->addWidget(surfaceCB); vLayout->addWidget(new QLabel(QStringLiteral("Select surface sample"))); vLayout->addWidget(sqrtSinCB); vLayout->addWidget(planeCB); @@ -237,6 +242,8 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::toggleSmooth); QObject::connect(surfaceGridCB, &QCheckBox::stateChanged, modifier, &GraphModifier::toggleSurfaceGrid); + QObject::connect(surfaceCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurface); QObject::connect(sqrtSinCB, &QRadioButton::toggled, modifier, &GraphModifier::toggleSqrtSin); QObject::connect(planeCB, &QCheckBox::toggled, |