Контроль количества ячеек на графическом графике с помощью диаграммы Qt

#qt #qtcharts

#qt #qtcharts

Вопрос:

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

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

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

mainwindow.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;
}
  

Ответ №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 вы можете либо визуализировать сцену целиком, либо увеличить масштаб и просмотреть только ее части.