main.cpp Example File

bars/main.cpp

  /****************************************************************************
  **
  ** 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$
  **
  ****************************************************************************/

  #include "graphmodifier.h"

  #include <QtWidgets/QApplication>
  #include <QtWidgets/QWidget>
  #include <QtWidgets/QHBoxLayout>
  #include <QtWidgets/QVBoxLayout>
  #include <QtWidgets/QPushButton>
  #include <QtWidgets/QCheckBox>
  #include <QtWidgets/QSlider>
  #include <QtWidgets/QFontComboBox>
  #include <QtWidgets/QLabel>
  #include <QtWidgets/QMessageBox>
  #include <QtGui/QScreen>
  #include <QtGui/QFontDatabase>

  int main(int argc, char **argv)
  {
      QApplication app(argc, argv);
      Q3DBars *widgetgraph = new Q3DBars();
      QWidget *container = QWidget::createWindowContainer(widgetgraph);

      if (!widgetgraph->hasContext()) {
          QMessageBox msgBox;
          msgBox.setText("Couldn't initialize the OpenGL context.");
          msgBox.exec();
          return -1;
      }

      QSize screenSize = widgetgraph->screen()->size();
      container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
      container->setMaximumSize(screenSize);
      container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
      container->setFocusPolicy(Qt::StrongFocus);

      QWidget *widget = new QWidget;
      QHBoxLayout *hLayout = new QHBoxLayout(widget);
      QVBoxLayout *vLayout = new QVBoxLayout();
      hLayout->addWidget(container, 1);
      hLayout->addLayout(vLayout);

      widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu and Helsinki, Finland (2006-2013)"));

      QComboBox *themeList = new QComboBox(widget);
      themeList->addItem(QStringLiteral("Qt"));
      themeList->addItem(QStringLiteral("Primary Colors"));
      themeList->addItem(QStringLiteral("Digia"));
      themeList->addItem(QStringLiteral("Stone Moss"));
      themeList->addItem(QStringLiteral("Army Blue"));
      themeList->addItem(QStringLiteral("Retro"));
      themeList->addItem(QStringLiteral("Ebony"));
      themeList->addItem(QStringLiteral("Isabelle"));
      themeList->setCurrentIndex(0);

      QPushButton *labelButton = new QPushButton(widget);
      labelButton->setText(QStringLiteral("Change label style"));

      QCheckBox *smoothCheckBox = new QCheckBox(widget);
      smoothCheckBox->setText(QStringLiteral("Smooth bars"));
      smoothCheckBox->setChecked(false);

      QComboBox *barStyleList = new QComboBox(widget);
      barStyleList->addItem(QStringLiteral("Bar"), int(QAbstract3DSeries::MeshBar));
      barStyleList->addItem(QStringLiteral("Pyramid"), int(QAbstract3DSeries::MeshPyramid));
      barStyleList->addItem(QStringLiteral("Cone"), int(QAbstract3DSeries::MeshCone));
      barStyleList->addItem(QStringLiteral("Cylinder"), int(QAbstract3DSeries::MeshCylinder));
      barStyleList->addItem(QStringLiteral("Bevel bar"), int(QAbstract3DSeries::MeshBevelBar));
      barStyleList->addItem(QStringLiteral("Sphere"), int(QAbstract3DSeries::MeshSphere));
      barStyleList->setCurrentIndex(4);

      QPushButton *cameraButton = new QPushButton(widget);
      cameraButton->setText(QStringLiteral("Change camera preset"));

      QPushButton *zoomToSelectedButton = new QPushButton(widget);
      zoomToSelectedButton->setText(QStringLiteral("Zoom to selected bar"));

      QComboBox *selectionModeList = new QComboBox(widget);
      selectionModeList->addItem(QStringLiteral("None"),
                                 int(QAbstract3DGraph::SelectionNone));
      selectionModeList->addItem(QStringLiteral("Bar"),
                                 int(QAbstract3DGraph::SelectionItem));
      selectionModeList->addItem(QStringLiteral("Row"),
                                 int(QAbstract3DGraph::SelectionRow));
      selectionModeList->addItem(QStringLiteral("Bar and Row"),
                                 int(QAbstract3DGraph::SelectionItemAndRow));
      selectionModeList->addItem(QStringLiteral("Column"),
                                 int(QAbstract3DGraph::SelectionColumn));
      selectionModeList->addItem(QStringLiteral("Bar and Column"),
                                 int(QAbstract3DGraph::SelectionItemAndColumn));
      selectionModeList->addItem(QStringLiteral("Row and Column"),
                                 int(QAbstract3DGraph::SelectionRowAndColumn));
      selectionModeList->addItem(QStringLiteral("Bar, Row and Column"),
                                 int(QAbstract3DGraph::SelectionItemRowAndColumn));
      selectionModeList->addItem(QStringLiteral("Slice into Row"),
                                 int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow));
      selectionModeList->addItem(QStringLiteral("Slice into Row and Item"),
                                 int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow));
      selectionModeList->addItem(QStringLiteral("Slice into Column"),
                                 int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn));
      selectionModeList->addItem(QStringLiteral("Slice into Column and Item"),
                                 int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn));
      selectionModeList->addItem(QStringLiteral("Multi: Bar, Row, Col"),
                                 int(QAbstract3DGraph::SelectionItemRowAndColumn
                                     | QAbstract3DGraph::SelectionMultiSeries));
      selectionModeList->addItem(QStringLiteral("Multi, Slice: Row, Item"),
                                 int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow
                                     | QAbstract3DGraph::SelectionMultiSeries));
      selectionModeList->addItem(QStringLiteral("Multi, Slice: Col, Item"),
                                 int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn
                                     | QAbstract3DGraph::SelectionMultiSeries));
      selectionModeList->setCurrentIndex(1);

      QCheckBox *backgroundCheckBox = new QCheckBox(widget);
      backgroundCheckBox->setText(QStringLiteral("Show background"));
      backgroundCheckBox->setChecked(false);

      QCheckBox *gridCheckBox = new QCheckBox(widget);
      gridCheckBox->setText(QStringLiteral("Show grid"));
      gridCheckBox->setChecked(true);

      QCheckBox *seriesCheckBox = new QCheckBox(widget);
      seriesCheckBox->setText(QStringLiteral("Show second series"));
      seriesCheckBox->setChecked(false);

      QCheckBox *reverseValueAxisCheckBox = new QCheckBox(widget);
      reverseValueAxisCheckBox->setText(QStringLiteral("Reverse value axis"));
      reverseValueAxisCheckBox->setChecked(false);

      QCheckBox *reflectionCheckBox = new QCheckBox(widget);
      reflectionCheckBox->setText(QStringLiteral("Show reflections"));
      reflectionCheckBox->setChecked(false);

      QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget);
      rotationSliderX->setTickInterval(30);
      rotationSliderX->setTickPosition(QSlider::TicksBelow);
      rotationSliderX->setMinimum(-180);
      rotationSliderX->setValue(0);
      rotationSliderX->setMaximum(180);
      QSlider *rotationSliderY = new QSlider(Qt::Horizontal, widget);
      rotationSliderY->setTickInterval(15);
      rotationSliderY->setTickPosition(QSlider::TicksAbove);
      rotationSliderY->setMinimum(-90);
      rotationSliderY->setValue(0);
      rotationSliderY->setMaximum(90);

      QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
      fontSizeSlider->setTickInterval(10);
      fontSizeSlider->setTickPosition(QSlider::TicksBelow);
      fontSizeSlider->setMinimum(1);
      fontSizeSlider->setValue(30);
      fontSizeSlider->setMaximum(100);

      QFontComboBox *fontList = new QFontComboBox(widget);
      fontList->setCurrentFont(QFont("Times New Roman"));

      QComboBox *shadowQuality = new QComboBox(widget);
      shadowQuality->addItem(QStringLiteral("None"));
      shadowQuality->addItem(QStringLiteral("Low"));
      shadowQuality->addItem(QStringLiteral("Medium"));
      shadowQuality->addItem(QStringLiteral("High"));
      shadowQuality->addItem(QStringLiteral("Low Soft"));
      shadowQuality->addItem(QStringLiteral("Medium Soft"));
      shadowQuality->addItem(QStringLiteral("High Soft"));
      shadowQuality->setCurrentIndex(5);

      QComboBox *rangeList = new QComboBox(widget);
      rangeList->addItem(QStringLiteral("2006"));
      rangeList->addItem(QStringLiteral("2007"));
      rangeList->addItem(QStringLiteral("2008"));
      rangeList->addItem(QStringLiteral("2009"));
      rangeList->addItem(QStringLiteral("2010"));
      rangeList->addItem(QStringLiteral("2011"));
      rangeList->addItem(QStringLiteral("2012"));
      rangeList->addItem(QStringLiteral("2013"));
      rangeList->addItem(QStringLiteral("All"));
      rangeList->setCurrentIndex(8);

      QCheckBox *axisTitlesVisibleCB = new QCheckBox(widget);
      axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible"));
      axisTitlesVisibleCB->setChecked(true);

      QCheckBox *axisTitlesFixedCB = new QCheckBox(widget);
      axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed"));
      axisTitlesFixedCB->setChecked(true);

      QSlider *axisLabelRotationSlider = new QSlider(Qt::Horizontal, widget);
      axisLabelRotationSlider->setTickInterval(10);
      axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow);
      axisLabelRotationSlider->setMinimum(0);
      axisLabelRotationSlider->setValue(30);
      axisLabelRotationSlider->setMaximum(90);

      vLayout->addWidget(new QLabel(QStringLiteral("Rotate horizontally")));
      vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop);
      vLayout->addWidget(new QLabel(QStringLiteral("Rotate vertically")));
      vLayout->addWidget(rotationSliderY, 0, Qt::AlignTop);
      vLayout->addWidget(labelButton, 0, Qt::AlignTop);
      vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
      vLayout->addWidget(zoomToSelectedButton, 0, Qt::AlignTop);
      vLayout->addWidget(backgroundCheckBox);
      vLayout->addWidget(gridCheckBox);
      vLayout->addWidget(smoothCheckBox);
      vLayout->addWidget(reflectionCheckBox);
      vLayout->addWidget(seriesCheckBox);
      vLayout->addWidget(reverseValueAxisCheckBox);
      vLayout->addWidget(axisTitlesVisibleCB);
      vLayout->addWidget(axisTitlesFixedCB);
      vLayout->addWidget(new QLabel(QStringLiteral("Show year")));
      vLayout->addWidget(rangeList);
      vLayout->addWidget(new QLabel(QStringLiteral("Change bar style")));
      vLayout->addWidget(barStyleList);
      vLayout->addWidget(new QLabel(QStringLiteral("Change selection mode")));
      vLayout->addWidget(selectionModeList);
      vLayout->addWidget(new QLabel(QStringLiteral("Change theme")));
      vLayout->addWidget(themeList);
      vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
      vLayout->addWidget(shadowQuality);
      vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
      vLayout->addWidget(fontList);
      vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size")));
      vLayout->addWidget(fontSizeSlider);
      vLayout->addWidget(new QLabel(QStringLiteral("Axis label rotation")));
      vLayout->addWidget(axisLabelRotationSlider, 1, Qt::AlignTop);

      GraphModifier *modifier = new GraphModifier(widgetgraph);

      QObject::connect(rotationSliderX, &QSlider::valueChanged, modifier, &GraphModifier::rotateX);
      QObject::connect(rotationSliderY, &QSlider::valueChanged, modifier, &GraphModifier::rotateY);

      QObject::connect(labelButton, &QPushButton::clicked, modifier,
                       &GraphModifier::changeLabelBackground);
      QObject::connect(cameraButton, &QPushButton::clicked, modifier,
                       &GraphModifier::changePresetCamera);
      QObject::connect(zoomToSelectedButton, &QPushButton::clicked, modifier,
                       &GraphModifier::zoomToSelectedBar);

      QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setBackgroundEnabled);
      QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setGridEnabled);
      QObject::connect(smoothCheckBox, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setSmoothBars);
      QObject::connect(seriesCheckBox, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setSeriesVisibility);
      QObject::connect(reverseValueAxisCheckBox, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setReverseValueAxis);
      QObject::connect(reflectionCheckBox, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setReflection);

      QObject::connect(modifier, &GraphModifier::backgroundEnabledChanged,
                       backgroundCheckBox, &QCheckBox::setChecked);
      QObject::connect(modifier, &GraphModifier::gridEnabledChanged,
                       gridCheckBox, &QCheckBox::setChecked);

      QObject::connect(rangeList, SIGNAL(currentIndexChanged(int)), modifier,
                       SLOT(changeRange(int)));

      QObject::connect(barStyleList, SIGNAL(currentIndexChanged(int)), modifier,
                       SLOT(changeStyle(int)));

      QObject::connect(selectionModeList, SIGNAL(currentIndexChanged(int)), modifier,
                       SLOT(changeSelectionMode(int)));

      QObject::connect(themeList, SIGNAL(currentIndexChanged(int)), modifier,
                       SLOT(changeTheme(int)));

      QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
                       SLOT(changeShadowQuality(int)));

      QObject::connect(modifier, &GraphModifier::shadowQualityChanged, shadowQuality,
                       &QComboBox::setCurrentIndex);
      QObject::connect(widgetgraph, &Q3DBars::shadowQualityChanged, modifier,
                       &GraphModifier::shadowQualityUpdatedByVisual);

      QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
                       &GraphModifier::changeFontSize);
      QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
                       &GraphModifier::changeFont);

      QObject::connect(modifier, &GraphModifier::fontSizeChanged, fontSizeSlider,
                       &QSlider::setValue);
      QObject::connect(modifier, &GraphModifier::fontChanged, fontList,
                       &QFontComboBox::setCurrentFont);

      QObject::connect(axisTitlesVisibleCB, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setAxisTitleVisibility);
      QObject::connect(axisTitlesFixedCB, &QCheckBox::stateChanged, modifier,
                       &GraphModifier::setAxisTitleFixed);
      QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier,
                       &GraphModifier::changeLabelRotation);
      widget->show();
      return app.exec();
  }