8

我正在使用QtCharts

我需要在附加值后重新调整两个轴。我附加的值不在 0 和 1 之间,也不是 1970 年的值。

QtChart 轴缩放错误

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

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 发出包含新值的信号。多个打开的图表对话框连接到该信号。

void ChartDialog::liveUpdate(const RealTimeMeasureRegisters &registers)
{
    auto result = ((&registers)->*m_methodPtr)();

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

是否有一些简单的方法可以告诉 QDateTimeAxis (在我的情况下m_axisX)自动调整到新值?

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

4

3 回答 3

1

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

尽管在此示例中,在添加点时范围已受到限制,因此要走得更远,需要在下一个点超出范围时重新调整范围。

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

于 2016-12-28T09:41:18.833 回答
0

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

connect(m_series, &QXYSeries::pointAdded,
        this, &MyForm::autoScaleChart);

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

#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);
  }
}

您可以调整算法以获得更全面的一个或日期时间轴。

于 2021-09-26T12:05:58.807 回答
0

关于 m_series->append() 中的第一个参数。使用“qint64 QDateTime::toMSecsSincPoch()”更好....比如:

...
m_series->append(QDateTime::currentDateTime().toMSecsSincPoch(), result);
于 2018-05-07T01:37:14.640 回答