<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>customformatter.cpp Example File | 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 ><a href="qtdatavisualization-qmlaxisformatter-example.html">Qt Quick 2 Axis Formatter Example</a></td><td >customformatter.cpp Example File</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="sidebar-content" id="sidebar-content"></div></div> <h1 class="title">customformatter.cpp Example File</h1> <span class="subtitle">qmlaxisformatter/customformatter.cpp</span> <!-- $$$qmlaxisformatter/customformatter.cpp-description --> <div class="descr"> <a name="details"></a> <pre class="cpp"> <span class="comment">/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Data Visualization module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/</span> <span class="preprocessor">#include "customformatter.h"</span> <span class="preprocessor">#include <QtDataVisualization/QValue3DAxis></span> <span class="preprocessor">#include <QtQml/QQmlExtensionPlugin></span> <span class="preprocessor">#include <QtCore/QDebug></span> <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="type"><a href="qtdatavisualization-qmlmodule.html">QtDataVisualization</a></span>; Q_DECLARE_METATYPE(QValue3DAxisFormatter <span class="operator">*</span>) <span class="keyword">static</span> <span class="keyword">const</span> <span class="type">qreal</span> oneDayMs <span class="operator">=</span> <span class="number">60.0</span> <span class="operator">*</span> <span class="number">60.0</span> <span class="operator">*</span> <span class="number">24.0</span> <span class="operator">*</span> <span class="number">1000.0</span>; CustomFormatter<span class="operator">::</span>CustomFormatter(<span class="type">QObject</span> <span class="operator">*</span>parent) : QValue3DAxisFormatter(parent) { qRegisterMetaType<span class="operator"><</span>QValue3DAxisFormatter <span class="operator">*</span><span class="operator">></span>(); } CustomFormatter<span class="operator">::</span><span class="operator">~</span>CustomFormatter() { } QValue3DAxisFormatter <span class="operator">*</span>CustomFormatter<span class="operator">::</span>createNewInstance() <span class="keyword">const</span> { <span class="keyword">return</span> <span class="keyword">new</span> CustomFormatter(); } <span class="type">void</span> CustomFormatter<span class="operator">::</span>populateCopy(QValue3DAxisFormatter <span class="operator">&</span>copy) <span class="keyword">const</span> { QValue3DAxisFormatter<span class="operator">::</span>populateCopy(copy); CustomFormatter <span class="operator">*</span>customFormatter <span class="operator">=</span> <span class="keyword">static_cast</span><span class="operator"><</span>CustomFormatter <span class="operator">*</span><span class="operator">></span>(<span class="operator">&</span>copy); customFormatter<span class="operator">-</span><span class="operator">></span>m_originDate <span class="operator">=</span> m_originDate; customFormatter<span class="operator">-</span><span class="operator">></span>m_selectionFormat <span class="operator">=</span> m_selectionFormat; } <span class="type">void</span> CustomFormatter<span class="operator">::</span>recalculate() { <span class="comment">// We want our axis to always have gridlines at date breaks</span> <span class="comment">// Convert range into QDateTimes</span> <span class="type">QDateTime</span> minTime <span class="operator">=</span> valueToDateTime(<span class="type">qreal</span>(axis()<span class="operator">-</span><span class="operator">></span>min())); <span class="type">QDateTime</span> maxTime <span class="operator">=</span> valueToDateTime(<span class="type">qreal</span>(axis()<span class="operator">-</span><span class="operator">></span>max())); <span class="comment">// Find out the grid counts</span> <span class="type">QTime</span> midnight(<span class="number">0</span><span class="operator">,</span> <span class="number">0</span>); <span class="type">QDateTime</span> minFullDate(minTime<span class="operator">.</span>date()<span class="operator">,</span> midnight); <span class="type">int</span> gridCount <span class="operator">=</span> <span class="number">0</span>; <span class="keyword">if</span> (minFullDate <span class="operator">!</span><span class="operator">=</span> minTime) minFullDate <span class="operator">=</span> minFullDate<span class="operator">.</span>addDays(<span class="number">1</span>); <span class="type">QDateTime</span> maxFullDate(maxTime<span class="operator">.</span>date()<span class="operator">,</span> midnight); gridCount <span class="operator">+</span><span class="operator">=</span> minFullDate<span class="operator">.</span>daysTo(maxFullDate) <span class="operator">+</span> <span class="number">1</span>; <span class="type">int</span> subGridCount <span class="operator">=</span> axis()<span class="operator">-</span><span class="operator">></span>subSegmentCount() <span class="operator">-</span> <span class="number">1</span>; <span class="comment">// Reserve space for position arrays and label strings</span> gridPositions()<span class="operator">.</span>resize(gridCount); subGridPositions()<span class="operator">.</span>resize((gridCount <span class="operator">+</span> <span class="number">1</span>) <span class="operator">*</span> subGridCount); labelPositions()<span class="operator">.</span>resize(gridCount); labelStrings()<span class="operator">.</span>reserve(gridCount); <span class="comment">// Calculate positions and format labels</span> <span class="type">qint64</span> startMs <span class="operator">=</span> minTime<span class="operator">.</span>toMSecsSinceEpoch(); <span class="type">qint64</span> endMs <span class="operator">=</span> maxTime<span class="operator">.</span>toMSecsSinceEpoch(); <span class="type">qreal</span> dateNormalizer <span class="operator">=</span> endMs <span class="operator">-</span> startMs; <span class="type">qreal</span> firstLineOffset <span class="operator">=</span> (minFullDate<span class="operator">.</span>toMSecsSinceEpoch() <span class="operator">-</span> startMs) <span class="operator">/</span> dateNormalizer; <span class="type">qreal</span> segmentStep <span class="operator">=</span> oneDayMs <span class="operator">/</span> dateNormalizer; <span class="type">qreal</span> subSegmentStep <span class="operator">=</span> <span class="number">0</span>; <span class="keyword">if</span> (subGridCount <span class="operator">></span> <span class="number">0</span>) subSegmentStep <span class="operator">=</span> segmentStep <span class="operator">/</span> <span class="type">qreal</span>(subGridCount <span class="operator">+</span> <span class="number">1</span>); <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span> gridCount; i<span class="operator">+</span><span class="operator">+</span>) { <span class="type">qreal</span> gridValue <span class="operator">=</span> firstLineOffset <span class="operator">+</span> (segmentStep <span class="operator">*</span> <span class="type">qreal</span>(i)); gridPositions()<span class="operator">[</span>i<span class="operator">]</span> <span class="operator">=</span> <span class="type">float</span>(gridValue); labelPositions()<span class="operator">[</span>i<span class="operator">]</span> <span class="operator">=</span> <span class="type">float</span>(gridValue); labelStrings() <span class="operator"><</span><span class="operator"><</span> minFullDate<span class="operator">.</span>addDays(i)<span class="operator">.</span>toString(axis()<span class="operator">-</span><span class="operator">></span>labelFormat()); } <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span><span class="operator">=</span> gridCount; i<span class="operator">+</span><span class="operator">+</span>) { <span class="keyword">if</span> (subGridPositions()<span class="operator">.</span>size()) { <span class="keyword">for</span> (<span class="type">int</span> j <span class="operator">=</span> <span class="number">0</span>; j <span class="operator"><</span> subGridCount; j<span class="operator">+</span><span class="operator">+</span>) { <span class="type">float</span> position; <span class="keyword">if</span> (i) position <span class="operator">=</span> gridPositions()<span class="operator">.</span>at(i <span class="operator">-</span> <span class="number">1</span>) <span class="operator">+</span> subSegmentStep <span class="operator">*</span> (j <span class="operator">+</span> <span class="number">1</span>); <span class="keyword">else</span> position <span class="operator">=</span> gridPositions()<span class="operator">.</span>at(<span class="number">0</span>) <span class="operator">-</span> segmentStep <span class="operator">+</span> subSegmentStep <span class="operator">*</span> (j <span class="operator">+</span> <span class="number">1</span>); <span class="keyword">if</span> (position <span class="operator">></span> <span class="number">1.0f</span> <span class="operator">|</span><span class="operator">|</span> position <span class="operator"><</span> <span class="number">0.0f</span>) position <span class="operator">=</span> gridPositions()<span class="operator">.</span>at(<span class="number">0</span>); subGridPositions()<span class="operator">[</span>i <span class="operator">*</span> subGridCount <span class="operator">+</span> j<span class="operator">]</span> <span class="operator">=</span> position; } } } } <span class="type">QString</span> CustomFormatter<span class="operator">::</span>stringForValue(<span class="type">qreal</span> value<span class="operator">,</span> <span class="keyword">const</span> <span class="type">QString</span> <span class="operator">&</span>format) <span class="keyword">const</span> { Q_UNUSED(format) <span class="keyword">return</span> valueToDateTime(value)<span class="operator">.</span>toString(m_selectionFormat); } <span class="type">QDate</span> CustomFormatter<span class="operator">::</span>originDate() <span class="keyword">const</span> { <span class="keyword">return</span> m_originDate; } <span class="type">QString</span> CustomFormatter<span class="operator">::</span>selectionFormat() <span class="keyword">const</span> { <span class="keyword">return</span> m_selectionFormat; } <span class="type">void</span> CustomFormatter<span class="operator">::</span>setOriginDate(<span class="keyword">const</span> <span class="type">QDate</span> <span class="operator">&</span>date) { <span class="keyword">if</span> (m_originDate <span class="operator">!</span><span class="operator">=</span> date) { m_originDate <span class="operator">=</span> date; markDirty(<span class="keyword">true</span>); <span class="keyword">emit</span> originDateChanged(date); } } <span class="type">void</span> CustomFormatter<span class="operator">::</span>setSelectionFormat(<span class="keyword">const</span> <span class="type">QString</span> <span class="operator">&</span>format) { <span class="keyword">if</span> (m_selectionFormat <span class="operator">!</span><span class="operator">=</span> format) { m_selectionFormat <span class="operator">=</span> format; markDirty(<span class="keyword">true</span>); <span class="comment">// Necessary to regenerate already visible selection label</span> <span class="keyword">emit</span> selectionFormatChanged(format); } } <span class="type">QDateTime</span> CustomFormatter<span class="operator">::</span>valueToDateTime(<span class="type">qreal</span> value) <span class="keyword">const</span> { <span class="keyword">return</span> <span class="type">QDateTime</span>(m_originDate)<span class="operator">.</span>addMSecs(<span class="type">qint64</span>(oneDayMs <span class="operator">*</span> value)); } </pre> </div> <!-- @@@qmlaxisformatter/customformatter.cpp --> </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>