Управление количеством ящиков в блочном графике с помощью Qt Chart

Я пытаюсь понять, как контролировать количество блоков (или наборов блоков) в диаграмме с помощью диаграммы Qt и использовать полосу прокрутки для прокрутки всей диаграммы. Это похоже на этот пример (http://www.advsofteng.com/doc/cdcppdoc/zoomscrolltrackqt.htm).

Приведенный ниже код — это то, что я сделал, и он заполняет все поля в представлении диаграммы, независимо от их количества. Я выбрал «ScrollBarAsNeeded» для политик вертикальной и горизонтальной полосы прокрутки в конструкторе Qt.

введите описание изображения здесь

главное окно.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QChartView>
#include <QBoxPlotSeries>
#include <QBoxSet>
#include <QValueAxis>
#include <QBarCategoryAxis>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("192.168.2.103");
    db.setPort(5433);
    db.setUserName("vorlket");
    db.setPassword("K1156312j");
    db.setDatabaseName("fxproj");

    QBoxPlotSeries *bidaskSeries = new QBoxPlotSeries(this);
    bidaskSeries->setName("bidask");

    QStringList categories;

    if (db.open())
    {   
        QSqlQuery query;
        if (query.exec("SELECT EXTRACT(YEAR FROM month), EXTRACT(MONTH FROM month), bid_low, bid_lowquartile, bid_median, bid_upquartile, bid_high FROM audusd.ts_month_quotebid ORDER BY month"))
        {
            while (query.next())
            {
                categories << query.value(0).toString() + "-" + query.value(1).toString();

                QBoxSet *set = new QBoxSet();
                set->setValue(QBoxSet::LowerExtreme, query.value(2).toDouble());
                set->setValue(QBoxSet::LowerQuartile, query.value(3).toDouble());
                set->setValue(QBoxSet::Median, query.value(4).toDouble());
                set->setValue(QBoxSet::UpperQuartile, query.value(5).toDouble());
                set->setValue(QBoxSet::UpperExtreme, query.value(6).toDouble());
                bidaskSeries->append(set);
            }
        }
        db.close();
    }

    QChart *chart = new QChart();
    chart->legend()->hide();
    chart->addSeries(bidaskSeries);

    QBarCategoryAxis * axisX = new QBarCategoryAxis();
    axisX->append(categories);
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->setAxisX(axisX, bidaskSeries);

    QValueAxis *axisY = new QValueAxis();
    chart->addAxis(axisY, Qt::AlignLeft);
    chart->setAxisY(axisY, bidaskSeries);
    axisY->setRange(0.65, 1.15);

    ui->chartview->setChart(chart);
    ui->chartview->setRenderHint(QPainter::Antialiasing);
}

MainWindow::~MainWindow()
{
    delete ui;
}

person vorlket    schedule 24.10.2016    source источник


Ответы (1)


Возможно, мне нужно использовать QGraphicsScene вместо QChartView.

http://doc.qt.io/qt-5/qchartview.html#details :

QChartView — это отдельный виджет, который может отображать диаграммы. Для работы не требуется отдельная QGraphicsScene. Если вы хотите отобразить диаграмму в существующей QGraphicsScene, вам нужно вместо этого использовать класс QChart (или QPolarChart).

http://doc.qt.io/qt-5/qgraphicsscene.html#details :

Класс QGraphicsScene предоставляет поверхность для управления большим количеством 2D-графических элементов.

Класс служит контейнером для QGraphicsItems. Он используется вместе с QGraphicsView для визуализации графических элементов, таких как линии, прямоугольники, текст или даже пользовательские элементы, на 2D-поверхности. QGraphicsScene является частью Graphics View Framework.

QGraphicsScene также предоставляет функциональные возможности, позволяющие эффективно определять как расположение элементов, так и определение того, какие элементы видны в произвольной области сцены. С виджетом QGraphicsView вы можете либо визуализировать всю сцену, либо увеличивать масштаб и просматривать только части сцены.

person vorlket    schedule 31.10.2016