用Qt Chart控制箱形图中的箱数

时间:2016-10-24 01:43:16

标签: qt qtchart

我试图弄清楚如何使用Qt图表控制框图中的框(或框集)数量,并使用滚动条滚动整个图表。它与此示例类似(http://www.advsofteng.com/doc/cdcppdoc/zoomscrolltrackqt.htm)。

下面的代码就是我所做的,它填充了chartview中的所有框,无论多少。我选择了ScrollBarAsNeeded'对于Qt设计器中的垂直和水平滚动条策略。

enter image description here

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 个答案:

答案 0 :(得分:0)

也许我需要使用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小部件,您既可以可视化整个场景,也可以放大并仅查看场景的一部分。