【发布时间】:2022-06-14 10:00:32
【问题描述】:
在QChartView中创建时序图时,发生在设置axis_x的过程中。
#!/usr/bin/env python3
import sys
import collections
# PySide6
from PySide6.QtGui import QPainter
from PySide6.QtWidgets import QWidget, QApplication, QMainWindow
from PySide6.QtCore import QPointF, QDateTime, QPoint
from PySide6.QtCharts import (QChartView, QLineSeries, QValueAxis,
QChart, QDateTimeAxis)
# PyQt5
# from PyQt5.QtGui import QPainter
# from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow
# from PyQt5.QtCore import QPointF, QDateTime, QPoint
# from PyQt5.QtChart import QChartView, QLineSeries, QValueAxis, QChart, QDateTimeAxis
class VisibilityView(QChartView):
def __init__(self, parent: QWidget, maxlen: int):
super().__init__(parent)
self.setMinimumSize(200, 200)
self.setMaximumSize(600, 400)
self.maxlen = maxlen
self.setRenderHint(QPainter.Antialiasing)
self.setMouseTracking(True)
chart = QChart()
chart.legend().setVisible(False)
self.setChart(chart)
self.chart().setTheme(QChart.ChartThemeDark)
self.series = QLineSeries(name='Prevailing Visibility')
chart.addSeries(self.series)
axis_x = QDateTimeAxis()
axis_x.setFormat('yy/MM/dd hh:mm')
axis_x.setTitleText('Time')
epoch = [1655168220000, 1655168230000, 1655168881000, 1655169840000,
1655169900000, 1655169960000, 1655170020000, 1655170080000,
1655170140000, 1655170200000, 1655170260000, 1655170320000,
1655170380000, 1655170500000, 1655170560000]
vis_list = [20.0, 17.0, 20.0, 20.0,
19.0, 20.0, 15.0, 20.0,
20.0, 20.0, 20.0, 20.0,
17.0, 20.0, 20.0]
data = []
for i in range(len(epoch)):
data.append((epoch[i], vis_list[i]))
self.data = collections.deque(data, maxlen=1440)
left = QDateTime.fromMSecsSinceEpoch(self.data[0][0])
right = QDateTime.fromMSecsSinceEpoch(self.data[-1][0])
axis_x.setRange(left, right)
chart.setAxisX(axis_x, self.series)
axis_y = QValueAxis()
axis_y.setRange(0, 20)
axis_y.setLabelFormat('%d km')
axis_y.setTitleText('Distance (km)')
chart.setAxisY(axis_y, self.series)
data_point = [QPointF(t, v) for t, v in self.data]
self.series.append(data_point)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QMainWindow()
graph = VisibilityView(window, 1440)
window.setCentralWidget(graph)
window.resize(graph.maximumSize())
window.show()
sys.exit(app.exec())
结果:
...
File "D:\Workspace\convert_pyside\src\visibility_view.py", line 94, in __init__
data_point = [QPointF(t, v) for t, v in self.data]
File "D:\Workspace\convert_pyside\src\visibility_view.py", line 94, in <listcomp>
data_point = [QPointF(t, v) for t, v in self.data]
OverflowError: Python int too large to convert to C long
但是,如果您使用相同的代码继续使用 PyQt5,则不会发生错误。
sys.maxsize 为 9223372036854775807,这对于两种环境都是相同的。 PySide 和 PyQt 有内部区别吗? 我该如何在 PySide 上解决这个问题?
【问题讨论】:
-
没有minimal reproducible example 很难为您提供帮助。尽管如此,如果您使用
data_point = [QPointF(float(t), float(v)) for t, v in self.data]会怎样?顺便说一句,是的,PySide 和 PyQt 之间存在 差异:虽然它们实际上做的事情几乎相同,但它们 不 相同(这也是它们可以做到的原因不能一起使用)。