【问题标题】:QDateTimeAxis() - series are not displayedQDateTimeAxis() - 系列不显示
【发布时间】:2019-11-26 12:21:08
【问题描述】:

我正在构建包含 QCharts 的应用程序。一切正常,直到我将值轴更改为日期时间轴。现在我在图表上看不到任何系列。我正在尝试其他主题中提供的有关堆栈溢出的方法,但没有成功。

我正在尝试按照其他主题中的建议将日期时间更改为自纪元以来的毫秒,当我设置 x 轴的范围时 - 不幸的是,在 x 轴上使用此方法时,我看到纪元时间而不是当前时间。 当我像现在这样设置范围时,我在 x 轴上看到了正确的时间,但我没有看到任何系列。

我已经检查了系列 - 在 x、y 轴的范围内有正确的点。

我正在使用 python 3.7 和 pyside2。

self.plot = QtCharts.QChart()
self.add_series("Magnitude (Column 1)", [0, 1])
self.chart_view = QtCharts.QChartView(self.plot)

self.series = QtCharts.QLineSeries()
self.series.setName(name)
self.plot.addSeries(self.series)

# Setting X-axis
self.axis_x = QtCharts.QDateTimeAxis()
self.axis_x.setTickCount(10)
self.axis_x.setLabelsAngle(70)
self.axis_x.setFormat("dd.MM.yy h:mm:ss")
self.axis_x.setTitleText("Date")
self.axis_x.setMax(QDateTime.currentDateTime().addSecs(60))
self.axis_x.setMin(QDateTime.currentDateTime())

# Setting Y-axis
self.axis_y = QtCharts.QValueAxis()
self.axis_y.setTickCount(7)
self.axis_y.setLabelFormat("%i")
self.axis_y.setTitleText("Temperature [celcious]")
self.axis_y.setMax(30)
self.axis_y.setMin(20)

self.series.attachAxis(self.axis_x)
self.series.attachAxis(self.axis_y)
self.plot.addAxis(self.axis_x, Qt.AlignBottom)
self.plot.addAxis(self.axis_y, Qt.AlignLeft)
...

# Add points to the chart
def addPoint(self):
    x = QDateTime.currentDateTime().toSecsSinceEpoch()
    y = float(20+self.i)

    self.series.append(x, y)
    print(self.series.points())
    self.i += 1
    print(QDateTime.currentDateTime().toMSecsSinceEpoch(),y)

【问题讨论】:

    标签: python pyside2 qtcharts


    【解决方案1】:

    您必须使用 toMSecsSinceEpoch() 方法而不是 toSecsSinceEpoch()。根据我的经验,我发现每次添加数据时都需要建立范围(可能是 QtCharts 错误)。

    考虑到上面的解决方案是:

    import random
    from PySide2 import QtCore, QtGui, QtWidgets
    from PySide2.QtCharts import QtCharts
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
    
            self.plot = QtCharts.QChart()
            # self.add_series("Magnitude (Column 1)", [0, 1])
            self.chart_view = QtCharts.QChartView(self.plot)
            self.setCentralWidget(self.chart_view)
    
            self.series = QtCharts.QLineSeries()
            self.series.setName("Magnitude")
            self.plot.addSeries(self.series)
    
            # Setting X-axis
            self.axis_x = QtCharts.QDateTimeAxis()
            self.axis_x.setTickCount(10)
            self.axis_x.setLabelsAngle(70)
            self.axis_x.setFormat("dd.MM.yy h:mm:ss")
            self.axis_x.setTitleText("Date")
            self.axis_x.setMax(QtCore.QDateTime.currentDateTime().addSecs(60))
            self.axis_x.setMin(QtCore.QDateTime.currentDateTime())
    
            # Setting Y-axis
            self.axis_y = QtCharts.QValueAxis()
            self.axis_y.setTickCount(7)
            self.axis_y.setLabelFormat("%i")
            self.axis_y.setTitleText("Temperature [celcious]")
            self.axis_y.setMax(30)
            self.axis_y.setMin(20)
    
            self.plot.setAxisX(self.axis_x, self.series)
            self.plot.setAxisY(self.axis_y, self.series)
            # ...
            timer = QtCore.QTimer(self)
            timer.timeout.connect(self.addPoint)
            timer.start(500)
    
        # Add points to the chart
        def addPoint(self):
            dt = QtCore.QDateTime.currentDateTime()
            v = random.uniform(20, 30)
            self.series.append(dt.toMSecsSinceEpoch(), v)
            t_m, t_M = min(dt, self.axis_x.min()), max(dt, self.axis_x.max())
            m, M = min(v, self.axis_y.min()), max(v, self.axis_y.max())
            self.axis_x.setRange(t_m, t_M)
            self.axis_y.setRange(m, M)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.resize(640, 480)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 通过该示例,我看到错误代码 self.series.append(dt.toMSecsSinceEpoch(), self.i) OverflowError: Python int too large to convert to C long I've added to the计时器功能:self.axis_x.setRange(QDateTime.currentDateTime().toMSecsSinceEpoch(), QDateTime.currentDateTime().addSecs(60).toMSecsSinceEpoch()) 但我没有看到 x axe 的任何更新
    • @kolumb 你有什么版本的pyside2?
    • pyside2 v5.13.0
    • 我找到了解决方案,需要将其转换为浮点数
    • @kolumb 这对我来说似乎很奇怪,在 Linux 中这不是必需的,这似乎是一个错误。将其发布为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多