我目前正在尝试使用 PySide6 (6.6.1) 和 matplotlib (3.8.2) 绘制图表。但是,只有当我不使用 PySide6 的 Snake_case 功能时,这才可以按预期工作。如果我使用snake_case,则仅显示黑色画布。
from PySide6.QtWidgets import QMainWindow, QApplication
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from __feature__ import snake_case
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
figure = Figure()
ax = figure.add_subplot(111)
ax.plot([1, 2, 3], [2, 3, 1])
canvas = FigureCanvasQTAgg(figure)
self.set_central_widget(canvas)
self.show()
app = QApplication()
w = MainWindow()
app.exec()
这是一个错误还是有办法解决这个问题?
解决方法
我们可以添加重新实现的 qt 方法的蛇形版本。在Figure类中并让他们调用camelCase版本
import re
_RE_CAMELCASE_SNAKE_CASE = re.compile(r'(?<!^)(?=[A-Z])')
# qt methods reimpl. in Figure
_QT6_METHODS = [
'enterEvent',
'keyPressEvent',
'keyReleaseEvent',
'leaveEvent',
'mouseDoubleClickEvent',
'mouseMoveEvent',
'mousePressEvent',
'mouseReleaseEvent',
'paintEvent',
'resizeEvent',
'showEvent',
'wheelEvent',
'sizeHint',
'minimumSizeHint'
]
def _camel_to_snake(camel_case: str) -> str:
"""convert camelCase to snake_case"""
return _RE_CAMELCASE_SNAKE_CASE.sub('_', camel_case).lower()
def add_snake_case_methods(cls):
for method in _QT6_METHODS:
setattr(cls, _camel_to_snake(method), getattr(cls, method))
return cls
然后我们就可以像这样使用它了
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from __feature__ import snake_case
FigureCanvasQTAgg = add_snake_case_methods(FigureCanvasQTAgg)