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

我的对话框的构造函数代码如下所示:
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 ®isters)
{
auto result = ((®isters)->*m_methodPtr)();
m_series->append(registers.timestamp(), result);
}有什么简单的方法可以告诉m_axisX**) (在我的例子中是 QDateTimeAxis )自动调整新值吗?**
QDateTimeAxis::setRange()看起来不太好,因为我需要设置一个最小值和最大值。
发布于 2016-12-28 09:41:18
我不知道一种自动调整的方法,但是您可以看看这个例子,它动态地向图表添加点:http://doc.qt.io/qt-5/qtcharts-dynamicspline-example.html
虽然在这个例子中,当添加点时,范围是有限的,所以要更进一步,需要在下一个点超出它时重新调整范围。
正如您所说,setRange需要一个分钟和一个最大值,但是可以在您的liveUpdate中更新它。
发布于 2018-05-07 01:37:14
关于m_series中的第一个参数->append()。使用"qint64 QDateTime::toMSecsSincPoch()“更好.像这样:
...
m_series->append(QDateTime::currentDateTime().toMSecsSincPoch(), result);发布于 2021-09-26 12:05:58
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);
}
}您可以将算法调整为更全面的时间轴或日期时间轴。
https://stackoverflow.com/questions/39409994
复制相似问题