0

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

下面的代码是我所做的,它填充了图表视图中的所有框,无论有多少。我为 Qt 设计器中的垂直和水平滚动条策略选择了“ScrollBarAsNeeded”。

在此处输入图像描述

主窗口.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;
}
4

1 回答 1

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 是图形视图框架的一部分。

QGraphicsScene 还提供了让您有效地确定项目的位置以及确定哪些项目在场景的任意区域内可见的功能。使用 QGraphicsView 小部件,您可以可视化整个场景,也可以放大并仅查看部分场景。

于 2016-10-31T04:09:18.770 回答