<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!-- scatter.qdoc --> <title>Scatter Example | Qt Data Visualization 5.12.6</title> <link rel="stylesheet" type="text/css" href="style/offline-simple.css" /> <script type="text/javascript"> document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css"); // loading style sheet breaks anchors that were jumped to before // so force jumping to anchor again setTimeout(function() { var anchor = location.hash; // need to jump to different anchor first (e.g. none) location.hash = "#"; setTimeout(function() { location.hash = anchor; }, 0); }, 0); </script> </head> <body> <div class="header" id="qtdocheader"> <div class="main"> <div class="main-rounded"> <div class="navigationbar"> <table><tr> <td >Qt 5.12</td><td ><a href="qtdatavisualization-index.html">Qt Data Visualization</a></td><td >Scatter Example</td></tr></table><table class="buildversion"><tr> <td id="buildversion" width="100%" align="right"><a href="qtdatavisualization-index.html">Qt Data Visualization | Commercial or GPLv3</a></td> </tr></table> </div> </div> <div class="content"> <div class="line"> <div class="content mainContent"> <div class="sidebar"> <div class="toc"> <h3><a name="toc">Contents</a></h3> <ul> <li class="level1"><a href="#running-the-example">Running the Example</a></li> <li class="level1"><a href="#creating-the-application">Creating the Application</a></li> <li class="level1"><a href="#setting-up-the-graph">Setting up the Graph</a></li> <li class="level1"><a href="#adding-data-to-the-graph">Adding Data to the Graph</a></li> <li class="level1"><a href="#using-widgets-to-control-the-graph">Using Widgets to Control the Graph</a></li> <li class="level1"><a href="#example-contents">Example Contents</a></li> </ul> </div> <div class="sidebar-content" id="sidebar-content"></div></div> <h1 class="title">Scatter Example</h1> <span class="subtitle"></span> <!-- $$$scatter-brief --> <p>Using <a href="q3dscatter.html">Q3DScatter</a> in a widget application.</p> <!-- @@@scatter --> <!-- $$$scatter-description --> <div class="descr"> <a name="details"></a> <p>The scatter example shows how to make a simple 3D scatter graph using <a href="q3dscatter.html">Q3DScatter</a> and combining the use of widgets for adjusting several adjustable qualities. The example shows how to:</p> <ul> <li>Create an application with <a href="q3dscatter.html">Q3DScatter</a> and some widgets</li> <li>Use <a href="qscatterdataproxy.html">QScatterDataProxy</a> to set data to the graph</li> <li>Adjust some graph properties using widget controls</li> </ul> <p>For instructions about how to interact with the graph, see <a href="qtdatavisualization-interacting-with-data.html">this page</a>.</p> <p class="centerAlign"><img src="images/scatter-example.png" alt="" /></p><a name="running-the-example"></a> <h2 id="running-the-example">Running the Example</h2> <p>To run the example from Qt Creator, open the <b>Welcome</b> mode and select the example from <b>Examples</b>. For more information, visit Building and Running an Example.</p> <a name="creating-the-application"></a> <h2 id="creating-the-application">Creating the Application</h2> <p>First, in main.cpp, we create a QApplication, instantiate <a href="q3dscatter.html">Q3DScatter</a>, and a window container for it:</p> <pre class="cpp"> <span class="type">QApplication</span> app(argc<span class="operator">,</span> argv); <span class="type"><a href="q3dscatter.html">Q3DScatter</a></span> <span class="operator">*</span>graph <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="q3dscatter.html">Q3DScatter</a></span>(); <span class="type">QWidget</span> <span class="operator">*</span>container <span class="operator">=</span> <span class="type">QWidget</span><span class="operator">::</span>createWindowContainer(graph); </pre> <p>The call to QWidget::createWindowContainer is required, as all data visualization graph classes (<a href="q3dbars.html">Q3DBars</a>, <a href="q3dscatter.html">Q3DScatter</a>, and <a href="q3dsurface.html">Q3DSurface</a>) inherit QWindow. Any class inheriting QWindow cannot be used as a widget any other way.</p> <p>Then we'll create horizontal and vertical layouts. We'll add the graph and the vertical layout into the horizontal one:</p> <pre class="cpp"> <span class="type">QWidget</span> <span class="operator">*</span>widget <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QWidget</span>; <span class="type">QHBoxLayout</span> <span class="operator">*</span>hLayout <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QHBoxLayout</span>(widget); <span class="type">QVBoxLayout</span> <span class="operator">*</span>vLayout <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QVBoxLayout</span>(); hLayout<span class="operator">-</span><span class="operator">></span>addWidget(container<span class="operator">,</span> <span class="number">1</span>); hLayout<span class="operator">-</span><span class="operator">></span>addLayout(vLayout); </pre> <p>We're not using the vertical layout for anything yet, but we'll get back to it in <a href="qtdatavisualization-scatter-example.html#using-widgets-to-control-the-graph">Using widgets to control the graph</a></p> <p>Next, let's create another class to handle the data addition and other interaction with the graph. Let's call it <code>ScatterDataModifier</code> (See <a href="qtdatavisualization-scatter-example.html#setting-up-the-graph">Setting up the graph</a> and <a href="qtdatavisualization-scatter-example.html#adding-data-to-the-graph">Adding data to the graph</a> for details):</p> <pre class="cpp"> ScatterDataModifier <span class="operator">*</span>modifier <span class="operator">=</span> <span class="keyword">new</span> ScatterDataModifier(graph); </pre> <p>The application main is done. We can show the graph and start the event loop:</p> <pre class="cpp"> widget<span class="operator">-</span><span class="operator">></span>show(); <span class="keyword">return</span> app<span class="operator">.</span>exec(); </pre> <a name="setting-up-the-graph"></a> <h2 id="setting-up-the-graph">Setting up the Graph</h2> <p>Let's set up some visual qualities for the graph in the constructor of the <code>ScatterDataModifier</code> class we instantiated in the application main:</p> <pre class="cpp"> m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>setType(<span class="type"><a href="q3dtheme.html">Q3DTheme</a></span><span class="operator">::</span>ThemeEbony); <span class="type">QFont</span> font <span class="operator">=</span> m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>font(); font<span class="operator">.</span>setPointSize(m_fontSize); m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>setFont(font); m_graph<span class="operator">-</span><span class="operator">></span>setShadowQuality(QAbstract3DGraph<span class="operator">::</span>ShadowQualitySoftLow); m_graph<span class="operator">-</span><span class="operator">></span>scene()<span class="operator">-</span><span class="operator">></span>activeCamera()<span class="operator">-</span><span class="operator">></span>setCameraPreset(<span class="type"><a href="q3dcamera.html">Q3DCamera</a></span><span class="operator">::</span>CameraPresetFront); </pre> <p>None of these are required, but are used to override graph defaults. You can try how it looks with the preset defaults by commenting the block above out.</p> <p>Finally we create a <a href="qscatterdataproxy.html">QScatterDataProxy</a> and the associated <a href="qscatter3dseries.html">QScatter3DSeries</a>. We set custom label format and mesh smoothing for the series and add it to the graph:</p> <pre class="cpp"> <span class="type"><a href="qscatterdataproxy.html">QScatterDataProxy</a></span> <span class="operator">*</span>proxy <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qscatterdataproxy.html">QScatterDataProxy</a></span>; QScatter3DSeries <span class="operator">*</span>series <span class="operator">=</span> <span class="keyword">new</span> QScatter3DSeries(proxy); series<span class="operator">-</span><span class="operator">></span>setItemLabelFormat(<span class="type">QStringLiteral</span>(<span class="string">"@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel"</span>)); series<span class="operator">-</span><span class="operator">></span>setMeshSmooth(m_smooth); m_graph<span class="operator">-</span><span class="operator">></span>addSeries(series); </pre> <p>That concludes setting up the graph.</p> <a name="adding-data-to-the-graph"></a> <h2 id="adding-data-to-the-graph">Adding Data to the Graph</h2> <p>The last thing we do in the <code>ScatterDataModifier</code> constructor is to add data to the graph:</p> <pre class="cpp"> addData(); </pre> <p>The actual data addition is done in <code>addData()</code> method. First we configure the axes:</p> <pre class="cpp"> m_graph<span class="operator">-</span><span class="operator">></span>axisX()<span class="operator">-</span><span class="operator">></span>setTitle(<span class="string">"X"</span>); m_graph<span class="operator">-</span><span class="operator">></span>axisY()<span class="operator">-</span><span class="operator">></span>setTitle(<span class="string">"Y"</span>); m_graph<span class="operator">-</span><span class="operator">></span>axisZ()<span class="operator">-</span><span class="operator">></span>setTitle(<span class="string">"Z"</span>); </pre> <p>This could have been done in the constructor of <code>ScatterDataModifier</code>, but we added it here to keep the constructor simpler and the axes configuration near the data.</p> <p>Next we create a data array:</p> <pre class="cpp"> <span class="type"><a href="qscatterdataproxy.html#QScatterDataArray-typedef">QScatterDataArray</a></span> <span class="operator">*</span>dataArray <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qscatterdataproxy.html#QScatterDataArray-typedef">QScatterDataArray</a></span>; dataArray<span class="operator">-</span><span class="operator">></span>resize(m_itemCount); <span class="type"><a href="qscatterdataitem.html">QScatterDataItem</a></span> <span class="operator">*</span>ptrToDataArray <span class="operator">=</span> <span class="operator">&</span>dataArray<span class="operator">-</span><span class="operator">></span>first(); </pre> <p>and populate it:</p> <pre class="cpp"> <span class="type">float</span> limit <span class="operator">=</span> qSqrt(m_itemCount) <span class="operator">/</span> <span class="number">2.0f</span>; <span class="keyword">for</span> (<span class="type">float</span> i <span class="operator">=</span> <span class="operator">-</span>limit; i <span class="operator"><</span> limit; i<span class="operator">+</span><span class="operator">+</span>) { <span class="keyword">for</span> (<span class="type">float</span> j <span class="operator">=</span> <span class="operator">-</span>limit; j <span class="operator"><</span> limit; j<span class="operator">+</span><span class="operator">+</span>) { ptrToDataArray<span class="operator">-</span><span class="operator">></span>setPosition(QVector3D(i <span class="operator">+</span> <span class="number">0.5f</span><span class="operator">,</span> qCos(qDegreesToRadians((i <span class="operator">*</span> j) <span class="operator">/</span> m_curveDivider))<span class="operator">,</span> j <span class="operator">+</span> <span class="number">0.5f</span>)); ptrToDataArray<span class="operator">+</span><span class="operator">+</span>; } } </pre> <p>Finally we tell the proxy to start using the data we gave it:</p> <pre class="cpp"> m_graph<span class="operator">-</span><span class="operator">></span>seriesList()<span class="operator">.</span>at(<span class="number">0</span>)<span class="operator">-</span><span class="operator">></span>dataProxy()<span class="operator">-</span><span class="operator">></span>resetArray(dataArray); </pre> <p>Now our graph has the data and is ready to be used. There isn't much interaction yet, though, so let's continue by adding some widgets to play with.</p> <a name="using-widgets-to-control-the-graph"></a> <h2 id="using-widgets-to-control-the-graph">Using Widgets to Control the Graph</h2> <p>First, back in the application main, we'll create some widgets:</p> <pre class="cpp"> <span class="type">QComboBox</span> <span class="operator">*</span>themeList <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QComboBox</span>(widget); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Qt"</span>)); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Primary Colors"</span>)); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Digia"</span>)); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Stone Moss"</span>)); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Army Blue"</span>)); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Retro"</span>)); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Ebony"</span>)); themeList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Isabelle"</span>)); themeList<span class="operator">-</span><span class="operator">></span>setCurrentIndex(<span class="number">6</span>); <span class="type">QPushButton</span> <span class="operator">*</span>labelButton <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QPushButton</span>(widget); labelButton<span class="operator">-</span><span class="operator">></span>setText(<span class="type">QStringLiteral</span>(<span class="string">"Change label style"</span>)); <span class="type">QCheckBox</span> <span class="operator">*</span>smoothCheckBox <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QCheckBox</span>(widget); smoothCheckBox<span class="operator">-</span><span class="operator">></span>setText(<span class="type">QStringLiteral</span>(<span class="string">"Smooth dots"</span>)); smoothCheckBox<span class="operator">-</span><span class="operator">></span>setChecked(<span class="keyword">true</span>); <span class="type">QComboBox</span> <span class="operator">*</span>itemStyleList <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QComboBox</span>(widget); itemStyleList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Sphere"</span>)<span class="operator">,</span> <span class="type">int</span>(QAbstract3DSeries<span class="operator">::</span>MeshSphere)); itemStyleList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Cube"</span>)<span class="operator">,</span> <span class="type">int</span>(QAbstract3DSeries<span class="operator">::</span>MeshCube)); itemStyleList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Minimal"</span>)<span class="operator">,</span> <span class="type">int</span>(QAbstract3DSeries<span class="operator">::</span>MeshMinimal)); itemStyleList<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Point"</span>)<span class="operator">,</span> <span class="type">int</span>(QAbstract3DSeries<span class="operator">::</span>MeshPoint)); itemStyleList<span class="operator">-</span><span class="operator">></span>setCurrentIndex(<span class="number">0</span>); <span class="type">QPushButton</span> <span class="operator">*</span>cameraButton <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QPushButton</span>(widget); cameraButton<span class="operator">-</span><span class="operator">></span>setText(<span class="type">QStringLiteral</span>(<span class="string">"Change camera preset"</span>)); <span class="type">QPushButton</span> <span class="operator">*</span>itemCountButton <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QPushButton</span>(widget); itemCountButton<span class="operator">-</span><span class="operator">></span>setText(<span class="type">QStringLiteral</span>(<span class="string">"Toggle item count"</span>)); <span class="type">QCheckBox</span> <span class="operator">*</span>backgroundCheckBox <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QCheckBox</span>(widget); backgroundCheckBox<span class="operator">-</span><span class="operator">></span>setText(<span class="type">QStringLiteral</span>(<span class="string">"Show background"</span>)); backgroundCheckBox<span class="operator">-</span><span class="operator">></span>setChecked(<span class="keyword">true</span>); <span class="type">QCheckBox</span> <span class="operator">*</span>gridCheckBox <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QCheckBox</span>(widget); gridCheckBox<span class="operator">-</span><span class="operator">></span>setText(<span class="type">QStringLiteral</span>(<span class="string">"Show grid"</span>)); gridCheckBox<span class="operator">-</span><span class="operator">></span>setChecked(<span class="keyword">true</span>); <span class="type">QComboBox</span> <span class="operator">*</span>shadowQuality <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QComboBox</span>(widget); shadowQuality<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"None"</span>)); shadowQuality<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Low"</span>)); shadowQuality<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Medium"</span>)); shadowQuality<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"High"</span>)); shadowQuality<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Low Soft"</span>)); shadowQuality<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"Medium Soft"</span>)); shadowQuality<span class="operator">-</span><span class="operator">></span>addItem(<span class="type">QStringLiteral</span>(<span class="string">"High Soft"</span>)); shadowQuality<span class="operator">-</span><span class="operator">></span>setCurrentIndex(<span class="number">4</span>); <span class="type">QFontComboBox</span> <span class="operator">*</span>fontList <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QFontComboBox</span>(widget); fontList<span class="operator">-</span><span class="operator">></span>setCurrentFont(<span class="type">QFont</span>(<span class="string">"Arial"</span>)); </pre> <p>And add them to the vertical layout we created earlier:</p> <pre class="cpp"> vLayout<span class="operator">-</span><span class="operator">></span>addWidget(labelButton<span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>AlignTop); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(cameraButton<span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>AlignTop); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(itemCountButton<span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>AlignTop); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(backgroundCheckBox); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(gridCheckBox); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(smoothCheckBox<span class="operator">,</span> <span class="number">0</span><span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>AlignTop); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(<span class="keyword">new</span> <span class="type">QLabel</span>(<span class="type">QStringLiteral</span>(<span class="string">"Change dot style"</span>))); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(itemStyleList); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(<span class="keyword">new</span> <span class="type">QLabel</span>(<span class="type">QStringLiteral</span>(<span class="string">"Change theme"</span>))); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(themeList); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(<span class="keyword">new</span> <span class="type">QLabel</span>(<span class="type">QStringLiteral</span>(<span class="string">"Adjust shadow quality"</span>))); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(shadowQuality); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(<span class="keyword">new</span> <span class="type">QLabel</span>(<span class="type">QStringLiteral</span>(<span class="string">"Change font"</span>))); vLayout<span class="operator">-</span><span class="operator">></span>addWidget(fontList<span class="operator">,</span> <span class="number">1</span><span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>AlignTop); </pre> <p>Now, let's connect them to methods in ScatterDataModifier:</p> <pre class="cpp"> <span class="type">QObject</span><span class="operator">::</span>connect(cameraButton<span class="operator">,</span> <span class="operator">&</span><span class="type">QPushButton</span><span class="operator">::</span>clicked<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>changePresetCamera); <span class="type">QObject</span><span class="operator">::</span>connect(labelButton<span class="operator">,</span> <span class="operator">&</span><span class="type">QPushButton</span><span class="operator">::</span>clicked<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>changeLabelStyle); <span class="type">QObject</span><span class="operator">::</span>connect(itemCountButton<span class="operator">,</span> <span class="operator">&</span><span class="type">QPushButton</span><span class="operator">::</span>clicked<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>toggleItemCount); <span class="type">QObject</span><span class="operator">::</span>connect(backgroundCheckBox<span class="operator">,</span> <span class="operator">&</span><span class="type">QCheckBox</span><span class="operator">::</span>stateChanged<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>setBackgroundEnabled); <span class="type">QObject</span><span class="operator">::</span>connect(gridCheckBox<span class="operator">,</span> <span class="operator">&</span><span class="type">QCheckBox</span><span class="operator">::</span>stateChanged<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>setGridEnabled); <span class="type">QObject</span><span class="operator">::</span>connect(smoothCheckBox<span class="operator">,</span> <span class="operator">&</span><span class="type">QCheckBox</span><span class="operator">::</span>stateChanged<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>setSmoothDots); <span class="type">QObject</span><span class="operator">::</span>connect(modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>backgroundEnabledChanged<span class="operator">,</span> backgroundCheckBox<span class="operator">,</span> <span class="operator">&</span><span class="type">QCheckBox</span><span class="operator">::</span>setChecked); <span class="type">QObject</span><span class="operator">::</span>connect(modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>gridEnabledChanged<span class="operator">,</span> gridCheckBox<span class="operator">,</span> <span class="operator">&</span><span class="type">QCheckBox</span><span class="operator">::</span>setChecked); <span class="type">QObject</span><span class="operator">::</span>connect(itemStyleList<span class="operator">,</span> SIGNAL(currentIndexChanged(<span class="type">int</span>))<span class="operator">,</span> modifier<span class="operator">,</span> SLOT(changeStyle(<span class="type">int</span>))); <span class="type">QObject</span><span class="operator">::</span>connect(themeList<span class="operator">,</span> SIGNAL(currentIndexChanged(<span class="type">int</span>))<span class="operator">,</span> modifier<span class="operator">,</span> SLOT(changeTheme(<span class="type">int</span>))); <span class="type">QObject</span><span class="operator">::</span>connect(shadowQuality<span class="operator">,</span> SIGNAL(currentIndexChanged(<span class="type">int</span>))<span class="operator">,</span> modifier<span class="operator">,</span> SLOT(changeShadowQuality(<span class="type">int</span>))); <span class="type">QObject</span><span class="operator">::</span>connect(modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>shadowQualityChanged<span class="operator">,</span> shadowQuality<span class="operator">,</span> <span class="operator">&</span><span class="type">QComboBox</span><span class="operator">::</span>setCurrentIndex); <span class="type">QObject</span><span class="operator">::</span>connect(graph<span class="operator">,</span> <span class="operator">&</span><span class="type"><a href="q3dscatter.html">Q3DScatter</a></span><span class="operator">::</span>shadowQualityChanged<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>shadowQualityUpdatedByVisual); <span class="type">QObject</span><span class="operator">::</span>connect(fontList<span class="operator">,</span> <span class="operator">&</span><span class="type">QFontComboBox</span><span class="operator">::</span>currentFontChanged<span class="operator">,</span> modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>changeFont); <span class="type">QObject</span><span class="operator">::</span>connect(modifier<span class="operator">,</span> <span class="operator">&</span>ScatterDataModifier<span class="operator">::</span>fontChanged<span class="operator">,</span> fontList<span class="operator">,</span> <span class="operator">&</span><span class="type">QFontComboBox</span><span class="operator">::</span>setCurrentFont); </pre> <p>Here are the methods in ScatterDataModifier the signals were connected to:</p> <pre class="cpp"> <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>changeStyle(<span class="type">int</span> style) { <span class="type">QComboBox</span> <span class="operator">*</span>comboBox <span class="operator">=</span> qobject_cast<span class="operator"><</span><span class="type">QComboBox</span> <span class="operator">*</span><span class="operator">></span>(sender()); <span class="keyword">if</span> (comboBox) { m_style <span class="operator">=</span> QAbstract3DSeries<span class="operator">::</span>Mesh(comboBox<span class="operator">-</span><span class="operator">></span>itemData(style)<span class="operator">.</span>toInt()); <span class="keyword">if</span> (m_graph<span class="operator">-</span><span class="operator">></span>seriesList()<span class="operator">.</span>size()) m_graph<span class="operator">-</span><span class="operator">></span>seriesList()<span class="operator">.</span>at(<span class="number">0</span>)<span class="operator">-</span><span class="operator">></span>setMesh(m_style); } } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>setSmoothDots(<span class="type">int</span> smooth) { m_smooth <span class="operator">=</span> bool(smooth); QScatter3DSeries <span class="operator">*</span>series <span class="operator">=</span> m_graph<span class="operator">-</span><span class="operator">></span>seriesList()<span class="operator">.</span>at(<span class="number">0</span>); series<span class="operator">-</span><span class="operator">></span>setMeshSmooth(m_smooth); } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>changeTheme(<span class="type">int</span> theme) { <span class="type"><a href="q3dtheme.html">Q3DTheme</a></span> <span class="operator">*</span>currentTheme <span class="operator">=</span> m_graph<span class="operator">-</span><span class="operator">></span>activeTheme(); currentTheme<span class="operator">-</span><span class="operator">></span>setType(<span class="type"><a href="q3dtheme.html">Q3DTheme</a></span><span class="operator">::</span>Theme(theme)); <span class="keyword">emit</span> backgroundEnabledChanged(currentTheme<span class="operator">-</span><span class="operator">></span>isBackgroundEnabled()); <span class="keyword">emit</span> gridEnabledChanged(currentTheme<span class="operator">-</span><span class="operator">></span>isGridEnabled()); <span class="keyword">emit</span> fontChanged(currentTheme<span class="operator">-</span><span class="operator">></span>font()); } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>changePresetCamera() { <span class="keyword">static</span> <span class="type">int</span> preset <span class="operator">=</span> <span class="type"><a href="q3dcamera.html">Q3DCamera</a></span><span class="operator">::</span>CameraPresetFrontLow; m_graph<span class="operator">-</span><span class="operator">></span>scene()<span class="operator">-</span><span class="operator">></span>activeCamera()<span class="operator">-</span><span class="operator">></span>setCameraPreset((<span class="type"><a href="q3dcamera.html">Q3DCamera</a></span><span class="operator">::</span>CameraPreset)preset); <span class="keyword">if</span> (<span class="operator">+</span><span class="operator">+</span>preset <span class="operator">></span> <span class="type"><a href="q3dcamera.html">Q3DCamera</a></span><span class="operator">::</span>CameraPresetDirectlyBelow) preset <span class="operator">=</span> <span class="type"><a href="q3dcamera.html">Q3DCamera</a></span><span class="operator">::</span>CameraPresetFrontLow; } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>changeLabelStyle() { m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>setLabelBackgroundEnabled(<span class="operator">!</span>m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>isLabelBackgroundEnabled()); } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>changeFont(<span class="keyword">const</span> <span class="type">QFont</span> <span class="operator">&</span>font) { <span class="type">QFont</span> newFont <span class="operator">=</span> font; newFont<span class="operator">.</span>setPointSizeF(m_fontSize); m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>setFont(newFont); } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>shadowQualityUpdatedByVisual(QAbstract3DGraph<span class="operator">::</span>ShadowQuality sq) { <span class="type">int</span> quality <span class="operator">=</span> <span class="type">int</span>(sq); <span class="keyword">emit</span> shadowQualityChanged(quality); <span class="comment">// connected to a checkbox in main.cpp</span> } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>changeShadowQuality(<span class="type">int</span> quality) { QAbstract3DGraph<span class="operator">::</span>ShadowQuality sq <span class="operator">=</span> QAbstract3DGraph<span class="operator">::</span>ShadowQuality(quality); m_graph<span class="operator">-</span><span class="operator">></span>setShadowQuality(sq); } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>setBackgroundEnabled(<span class="type">int</span> enabled) { m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>setBackgroundEnabled((bool)enabled); } <span class="type">void</span> ScatterDataModifier<span class="operator">::</span>setGridEnabled(<span class="type">int</span> enabled) { m_graph<span class="operator">-</span><span class="operator">></span>activeTheme()<span class="operator">-</span><span class="operator">></span>setGridEnabled((bool)enabled); } </pre> <p>And so we have an application in which we can control:</p> <ul> <li>Label style</li> <li>Camera preset</li> <li>Background visibility</li> <li>Grid visibility</li> <li>Dot shading smoothness</li> <li>Dot style</li> <li>Theme</li> <li>Shadow quality</li> <li>Label font</li> </ul> <a name="example-contents"></a> <h2 id="example-contents">Example Contents</h2> <p>Files:</p> <ul> <li><a href="qtdatavisualization-scatter-main-cpp.html">scatter/main.cpp</a></li> <li><a href="qtdatavisualization-scatter-scatter-pro.html">scatter/scatter.pro</a></li> <li><a href="qtdatavisualization-scatter-scatterdatamodifier-cpp.html">scatter/scatterdatamodifier.cpp</a></li> <li><a href="qtdatavisualization-scatter-scatterdatamodifier-h.html">scatter/scatterdatamodifier.h</a></li> </ul> </div> <!-- @@@scatter --> </div> </div> </div> </div> </div> <div class="footer"> <p> <acronym title="Copyright">©</acronym> 2019 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners.<br/> The documentation provided herein is licensed under the terms of the <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation License version 1.3</a> as published by the Free Software Foundation.<br/> Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners. </p> </div> </body> </html>