Как установить QChart Aspect Ratio - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь реализовать алгоритм для поддержания соотношения сторон QChart. Это отчасти работает, но мне было интересно, есть ли у кого-нибудь более простое решение.

ниже приведен код, который происходит при событии изменения размера

void TrainChartView::maintainAspectRatio(QSizeF eventSize) {

    int aspect = 8;
    QSizeF chartSize = m_chart->size();

    QValueAxis* axisX = qobject_cast<QValueAxis*>(m_chart->axisX());
    QValueAxis* axisY = qobject_cast<QValueAxis*>(m_chart->axisY());

    // get Min Max X-axis Value
    double minAxisX = axisX->min();
    double maxAxisX = axisX->max();
    double minAxisY = axisY->min();
    double maxAxisY = axisY->max();

    // Get Coordinates in scene of min and max X-axis value
    QPointF minAxisXPosition = m_chart->mapToPosition(QPointF(minAxisX, 0));
    QPointF maxAxisXPosition = m_chart->mapToPosition(QPointF(maxAxisX, 0));
    QPointF minAxisYPosition = m_chart->mapToPosition(QPointF(0, minAxisY));
    QPointF maxAxisYPosition = m_chart->mapToPosition(QPointF(0, maxAxisY));

    double axisXSize = abs(maxAxisXPosition.x() - minAxisXPosition.x());
    double axisYSize = abs(maxAxisXPosition.y() - minAxisYPosition.y());

    // get the size of axis x in the coordinate system
    double deltaAxisXSize = maxAxisXPosition.x() - minAxisXPosition.x();

    if (chartSize.width() != eventSize.width()) {
        QPointF maxAxisValue = m_chart->mapToValue(QPointF(0, (minAxisYPosition.y() - deltaAxisXSize)));
        axisY->setRange(minAxisY, maxAxisValue.y() / aspect);
    }

    if (chartSize.height() != eventSize.height() && m_chart->minimumSize().height() >= eventSize.height()) {
        double deltaHeight = eventSize.height() - chartSize.height();
        maxAxisYPosition.setY(maxAxisYPosition.y() - deltaHeight);
        QPointF maxAxisValue = m_chart->mapToValue(QPointF(maxAxisYPosition));

        axisY->setRange(minAxisY, maxAxisValue.y());

    }
...