Как идеально выровнять AxisRects в QCustomPlot с различными конфигурациями меток - PullRequest
0 голосов
/ 08 февраля 2019

Мы планируем использовать QCustomPlot для того, чтобы сделать несколько настраиваемых макетов графиков.

Для этого пользователь может определять заголовки или нет и может определять основную ось или альтернативную ось или нет.Наконец, он должен иметь возможность определять метки для всех осей или нет.

Если пользователь решает не показывать элементы, не должно быть ненужной траты пространства.

В качестве последней функции мы хотим, чтобы QCustomPlot располагал графики друг над другом так, чтобы QCPAxisRect из двух горизонтальных выровненных графиков также был идеально выровнен по горизонтали.

Моя первая попытка быласледующее, которое на самом деле не работает, так как два графика не идеально выровнены из-за различий левой и правой оси Y.

Есть ли способ достичь желаемого поведения, или это просто невозможно?

Я рассмотрел вариант создания надписей самостоятельно, используя QCPTextElement, но нет возможности писать текст по вертикали.

#include <QWidget>
#include "qcustomplot.h"

class PlotWidget : public QWidget {
    Q_OBJECT

public:
    PlotWidget(QWidget* parent=nullptr) : QWidget(parent)
    {
        mPlot = new QCustomPlot;
        setLayout(new QVBoxLayout);
        layout()->setMargin(0);
        layout()->addWidget(mPlot);
        mPlot->plotLayout()->clear();
        mPlot->plotLayout()->expandTo(6, 3);
        mPlot->plotLayout()->setRowStretchFactor(1, 100);
        mPlot->plotLayout()->setRowStretchFactor(1 + 3, 100);
        mPlot->plotLayout()->setColumnStretchFactor(1, 100);
        {
            auto text = new QCPTextElement(mPlot);
            text->setText("Plot1");
            mPlot->plotLayout()->addElement(0, 1, text);
            auto rect = new QCPAxisRect(mPlot);
            mPlot->plotLayout()->addElement(1, 1, rect);
            auto g = new QCPCurve(rect->axis(QCPAxis::atBottom), rect->axis(QCPAxis::atLeft));
            rect->axis(QCPAxis::atLeft)->setLabel("yLeft");
            g->setData({ 0,2,5 }, { 2,3,5 }, { 1,2,4 });
        }

        {
            auto text = new QCPTextElement(mPlot);
            text->setText("Plot2");
            mPlot->plotLayout()->addElement(0 + 3, 1, text);
            auto rect = new QCPAxisRect(mPlot);
            auto axis = new QCPAxis(rect, QCPAxis::atRight);
            axis->setLabel("yRight");
            rect->addAxis(QCPAxis::atRight, axis);
            mPlot->plotLayout()->addElement(1 + 3, 1, rect);
            auto g = new QCPCurve(rect->axis(QCPAxis::atBottom), rect->axis(QCPAxis::atRight));
            g->setData({ 0,2,6 }, { 2,3,5 }, { 1,2,4 });
        }

    }


private:
    QCustomPlot* mPlot{ nullptr };
};
...