QCustomPlotx轴单数显示刻度,双数不显示刻度
时间: 2023-07-15 16:15:47 浏览: 212
可以通过 QCustomPlot 的 QCPAxis::ticker() 函数自定义刻度的显示方式。以下是一个实现方案:
首先,需要继承 QCPAxisTicker,并实现其 tickStepStrategy() 和 ticker() 函数。tickStepStrategy() 函数返回一个枚举值,指示应该如何计算刻度的步长。在本例中,我们使用 QCPAxisTicker::sstAuto 标志,表示让 QCustomPlot 自动计算步长。ticker() 函数返回一个 QSharedPointer<QCPAxisTicker> 对象,表示实际的刻度计算器。
然后,继承 QCPAxisTickerFixed,并实现其 tickPositions() 函数。在本例中,我们将奇数位置的刻度保留下来,其余位置的刻度则被删除。
最后,将新的刻度计算器设置为 x 轴的 ticker 即可。
下面是完整的示例代码:
```cpp
#include <QtWidgets/QApplication>
#include "qcustomplot.h"
class MyAxisTicker : public QCPAxisTicker
{
public:
enum { Type = 0xf0f0 };
MyAxisTicker() {}
virtual int tickStepStrategy(QCPAxis::TickData& tickData, const QCPRange& range) Q_DECL_OVERRIDE
{
return QCPAxisTicker::sstAuto;
}
virtual QSharedPointer<QCPAxisTicker> makeSubstitute() const Q_DECL_OVERRIDE
{
return QSharedPointer<QCPAxisTicker>(new MyAxisTicker(*this));
}
};
class MyAxisTickerFixed : public QCPAxisTickerFixed
{
public:
MyAxisTickerFixed() {}
virtual QList<double> tickPositions(const QCPRange& range, const QCPAxis::TickData& data) const Q_DECL_OVERRIDE
{
QList<double> ticks;
double tickStep = getTickStep();
double lower = qCeil(range.lower / tickStep) * tickStep;
double upper = qFloor(range.upper / tickStep) * tickStep;
for (double tick = lower; tick <= upper; tick += tickStep)
{
if (fmod(tick / tickStep, 2.0) == 1.0)
ticks.append(tick);
}
return ticks;
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 创建 QCustomPlot 控件
QCustomPlot plot;
plot.setMinimumSize(500, 300);
plot.addGraph();
// 设置 x 轴刻度计算器
QSharedPointer<MyAxisTicker> ticker(new MyAxisTicker());
ticker->setTickCount(6);
ticker->setTickOrigin(0);
ticker->setTickStepStrategy(QCPAxisTicker::sstAuto);
ticker->setSubTickCount(0);
ticker->setDateTimeFormat("");
ticker->setDateTimeSpec(Qt::LocalTime);
ticker->setTickLabels(true);
ticker->setTickCount(10);
ticker->setTickStep(1);
ticker->setTickVector(QVector<double>() << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9);
ticker->setTickVectorLabels(QVector<QString>() << "0" << "" << "2" << "" << "4" << "" << "6" << "" << "8" << "");
plot.xAxis->setTicker(ticker);
// 绘制正弦函数
QVector<double> x(101), y(101);
for (int i = 0; i < 101; ++i)
{
x[i] = i / 20.0 - 1;
y[i] = qSin(x[i] * 2 * M_PI);
}
plot.graph(0)->setData(x, y);
// 显示图形
plot.replot();
plot.show();
return a.exec();
}
```
在上面的示例中,我们手动设置了 x 轴的刻度向量和标签向量,以保证奇数位置的刻度有标签,偶数位置的刻度没有标签。如果要动态计算刻度向量和标签向量,请根据具体需求修改 tickPositions() 函数的实现。
阅读全文