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