Graph Gallery
// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "scattergraph.h" #include <QtWidgets/qboxlayout.h> #include <QtWidgets/qcheckbox.h> #include <QtWidgets/qcombobox.h> #include <QtWidgets/qlabel.h> #include <QtWidgets/qcommandlinkbutton.h> using namespace Qt::StringLiterals; ScatterGraph::ScatterGraph() { m_scatterGraph = new Q3DScatter(); initialize(); } void ScatterGraph::initialize() { m_scatterWidget = new QWidget; auto *hLayout = new QHBoxLayout(m_scatterWidget); QSize screenSize = m_scatterGraph->screen()->size(); m_scatterGraph->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.75)); m_scatterGraph->setMaximumSize(screenSize); m_scatterGraph->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_scatterGraph->setFocusPolicy(Qt::StrongFocus); m_scatterGraph->setResizeMode(QQuickWidget::SizeRootObjectToView); hLayout->addWidget(m_scatterGraph, 1); auto *vLayout = new QVBoxLayout(); hLayout->addLayout(vLayout); auto *cameraButton = new QCommandLinkButton(m_scatterWidget); cameraButton->setText(u"Change camera preset"_s); cameraButton->setDescription(u"Switch between a number of preset camera positions"_s); cameraButton->setIconSize(QSize(0, 0)); auto *itemCountButton = new QCommandLinkButton(m_scatterWidget); itemCountButton->setText(u"Toggle item count"_s); itemCountButton->setDescription(u"Switch between 900 and 10000 data points"_s); itemCountButton->setIconSize(QSize(0, 0)); auto *rangeButton = new QCommandLinkButton(m_scatterWidget); rangeButton->setText(u"Toggle axis ranges"_s); rangeButton->setDescription(u"Switch between automatic axis ranges and preset ranges"_s); rangeButton->setIconSize(QSize(0, 0)); auto *rangeMinSlider = new QSlider(m_scatterWidget); rangeMinSlider->setOrientation(Qt::Horizontal); rangeMinSlider->setMinimum(-10); rangeMinSlider->setMaximum(1); rangeMinSlider->setValue(-10); auto *rangeMaxSlider = new QSlider(m_scatterWidget); rangeMaxSlider->setOrientation(Qt::Horizontal); rangeMaxSlider->setMinimum(1); rangeMaxSlider->setMaximum(10); rangeMaxSlider->setValue(10); auto *backgroundCheckBox = new QCheckBox(m_scatterWidget); backgroundCheckBox->setText(u"Show background"_s); backgroundCheckBox->setChecked(true); auto *gridCheckBox = new QCheckBox(m_scatterWidget); gridCheckBox->setText(u"Show grid"_s); gridCheckBox->setChecked(true); auto *smoothCheckBox = new QCheckBox(m_scatterWidget); smoothCheckBox->setText(u"Smooth dots"_s); smoothCheckBox->setChecked(true); auto *itemStyleList = new QComboBox(m_scatterWidget); itemStyleList->addItem(u"Sphere"_s, QAbstract3DSeries::MeshSphere); itemStyleList->addItem(u"Cube"_s, QAbstract3DSeries::MeshCube); itemStyleList->addItem(u"Minimal"_s, QAbstract3DSeries::MeshMinimal); itemStyleList->addItem(u"Point"_s, QAbstract3DSeries::MeshPoint); itemStyleList->setCurrentIndex(0); auto *themeList = new QComboBox(m_scatterWidget); themeList->addItem(u"Qt"_s); themeList->addItem(u"Primary Colors"_s); themeList->addItem(u"Digia"_s); themeList->addItem(u"Stone Moss"_s); themeList->addItem(u"Army Blue"_s); themeList->addItem(u"Retro"_s); themeList->addItem(u"Ebony"_s); themeList->addItem(u"Isabelle"_s); themeList->setCurrentIndex(3); auto *shadowQuality = new QComboBox(m_scatterWidget); shadowQuality->addItem(u"None"_s); shadowQuality->addItem(u"Low"_s); shadowQuality->addItem(u"Medium"_s); shadowQuality->addItem(u"High"_s); shadowQuality->addItem(u"Low Soft"_s); shadowQuality->addItem(u"Medium Soft"_s); shadowQuality->addItem(u"High Soft"_s); shadowQuality->setCurrentIndex(6); vLayout->addWidget(cameraButton); vLayout->addWidget(itemCountButton); vLayout->addWidget(rangeButton); vLayout->addWidget(new QLabel(u"Adjust axis ranges"_s)); vLayout->addWidget(rangeMinSlider); vLayout->addWidget(rangeMaxSlider); vLayout->addWidget(backgroundCheckBox); vLayout->addWidget(gridCheckBox); vLayout->addWidget(smoothCheckBox); vLayout->addWidget(new QLabel(u"Change dot style"_s)); vLayout->addWidget(itemStyleList); vLayout->addWidget(new QLabel(u"Change theme"_s)); vLayout->addWidget(themeList); vLayout->addWidget(new QLabel(u"Adjust shadow quality"_s)); vLayout->addWidget(shadowQuality, 1, Qt::AlignTop); // Raise the graph to the top of the widget stack, to hide UI if resized smaller m_scatterGraph->raise(); m_modifier = new ScatterDataModifier(m_scatterGraph, this); QObject::connect(cameraButton, &QCommandLinkButton::clicked, m_modifier, &ScatterDataModifier::changePresetCamera); QObject::connect(itemCountButton, &QCommandLinkButton::clicked, m_modifier, &ScatterDataModifier::toggleItemCount); QObject::connect(rangeButton, &QCommandLinkButton::clicked, m_modifier, &ScatterDataModifier::toggleRanges); QObject::connect(rangeMinSlider, &QSlider::valueChanged, m_modifier, &ScatterDataModifier::adjustMinimumRange); QObject::connect(rangeMaxSlider, &QSlider::valueChanged, m_modifier, &ScatterDataModifier::adjustMaximumRange); QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, m_modifier, &ScatterDataModifier::setBackgroundEnabled); QObject::connect(gridCheckBox, &QCheckBox::stateChanged, m_modifier, &ScatterDataModifier::setGridEnabled); QObject::connect(smoothCheckBox, &QCheckBox::stateChanged, m_modifier, &ScatterDataModifier::setSmoothDots); QObject::connect(m_modifier, &ScatterDataModifier::backgroundEnabledChanged, backgroundCheckBox, &QCheckBox::setChecked); QObject::connect(m_modifier, &ScatterDataModifier::gridEnabledChanged, gridCheckBox, &QCheckBox::setChecked); QObject::connect(itemStyleList, &QComboBox::currentIndexChanged, m_modifier, &ScatterDataModifier::changeStyle); QObject::connect(themeList, &QComboBox::currentIndexChanged, m_modifier, &ScatterDataModifier::changeTheme); QObject::connect(shadowQuality, &QComboBox::currentIndexChanged, m_modifier, &ScatterDataModifier::changeShadowQuality); QObject::connect(m_modifier, &ScatterDataModifier::shadowQualityChanged, shadowQuality, &QComboBox::setCurrentIndex); QObject::connect(m_scatterGraph, &Q3DScatter::shadowQualityChanged, m_modifier, &ScatterDataModifier::shadowQualityUpdatedByVisual); }