【问题标题】:Why OverflowError occured only on PySide6?为什么 OverflowError 只发生在 PySide6 上?
【发布时间】: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 之间存在 差异:虽然它们实际上做的事情几乎相同,但它们 相同(这也是它们可以做到的原因不能一起使用)。

标签: python pyqt pyside


猜你喜欢
  • 2023-02-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2023-02-06
  • 2015-03-27
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多