首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QtCharts中自动重绘轴?

如何在QtCharts中自动重绘轴?
EN

Stack Overflow用户
提问于 2016-09-09 10:55:43
回答 3查看 11.6K关注 0票数 8

我正在使用QtCharts

我需要两个轴在附加值之后被重新标度。我附加的数值不是0到1之间,也不是1970年的数值。

我的对话框的构造函数代码如下所示:

代码语言:javascript
复制
m_series = new QLineSeries;
m_series->setName(name);

auto chart = new QChart;
chart->legend()->setVisible(false);
chart->addSeries(m_series);

m_axisX = new QDateTimeAxis;
//m_axisX->setFormat("HH:mm:ss");
m_axisX->setTitleText(tr("Zeitpunkt"));
chart->addAxis(m_axisX, Qt::AlignBottom);

m_series->attachAxis(m_axisX);

auto axisY = new QValueAxis;
axisY->setTitleText(unit);
chart->addAxis(axisY, Qt::AlignLeft);

m_series->attachAxis(axisY);

auto chartView = new QChartView(chart, this);
chartView->setRenderHint(QPainter::Antialiasing);

我的MainWindow发出信号创造新的价值。多个打开的图表对话框连接到该信号。

代码语言:javascript
复制
void ChartDialog::liveUpdate(const RealTimeMeasureRegisters &registers)
{
    auto result = ((&registers)->*m_methodPtr)();

    m_series->append(registers.timestamp(), result);
}

有什么简单的方法可以告诉m_axisX**) (在我的例子中是 QDateTimeAxis )自动调整新值吗?**

QDateTimeAxis::setRange()看起来不太好,因为我需要设置一个最小值和最大值。

EN

回答 3

Stack Overflow用户

发布于 2016-12-28 09:41:18

我不知道一种自动调整的方法,但是您可以看看这个例子,它动态地向图表添加点:http://doc.qt.io/qt-5/qtcharts-dynamicspline-example.html

虽然在这个例子中,当添加点时,范围是有限的,所以要更进一步,需要在下一个点超出它时重新调整范围。

正如您所说,setRange需要一个分钟和一个最大值,但是可以在您的liveUpdate中更新它。

票数 1
EN

Stack Overflow用户

发布于 2018-05-07 01:37:14

关于m_series中的第一个参数->append()。使用"qint64 QDateTime::toMSecsSincPoch()“更好.像这样:

代码语言:javascript
复制
...
m_series->append(QDateTime::currentDateTime().toMSecsSincPoch(), result);
票数 0
EN

Stack Overflow用户

发布于 2021-09-26 12:05:58

QLineSeries继承了QXYSeries,它实现了您可以利用的特定信号,如下所示:

代码语言:javascript
复制
connect(m_series, &QXYSeries::pointAdded,
        this, &MyForm::autoScaleChart);

在您的表单或模型中,最好将图表和系列定义为成员,这样您就可以从名为autoScaleChart的成员方法(在Qt5中不需要插槽)访问它们。

代码语言:javascript
复制
#include <QMainWindow>
#include <QtCharts/QtCharts>
#include <math>
...

class MyForm :: QMainWindow
{
  Q_OBJECT
  public:
  ....

  private:
  QLineSeries* _series;
  QValueAxis* _xaxis;
  QValueAxis* _yaxis;
  QChart* _chart;
  void MyForm::autoScaleChart()
  {
    const QVector<QPointF>& dataVector = _tempSeries.pointsVector();
    double xMin = std::numeric_limits<double>::max();
    double xMax = std::numeric_limits<double>::min();
    double yMin = xMin;
    double yMax = xMax;
    for (auto p : dataVector)
    {
       xMin = qMin(xMin, p.x());
       xMax = qMax(xMax, p.x());
       yMin = qMin(yMin, p.y());
       yMax = qMax(yMax, p.y());
    }

    double xMargin = (xMax-xMin)/10.0;
    _xaxis.setRange(xMin-xMargin,xMax+xMargin);

    double yMargin = (yMax-yMin)/10.0;
    _yaxis.setRange(yMin-yMargin,yMax+yMargin);
  }
}

您可以将算法调整为更全面的时间轴或日期时间轴。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39409994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档