如何将QCustomPlot中的AxisRects与不同的标签配置完美对齐

时间:2019-02-08 08:01:29

标签: c++ layout qcustomplot

我们计划使用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 };
};

0 个答案:

没有答案