python PySide6 QCharts 垂直光标
时间: 2025-01-30 07:50:09 浏览: 46
### 实现 PySide6 QCharts 垂直光标
为了在 PySide6 的 `QChart` 中实现垂直光标的交互功能,可以利用 `QValueAxis`, `QSplineSeries` 和自定义鼠标事件处理来完成这一目标。下面是一个详细的解决方案:
#### 创建图表并设置坐标轴
首先创建一个基于 `QChartView` 的窗口类,在其中初始化图表对象,并配置 X 轴为数值型以便后续能够精确控制光标位置。
```python
from PySide6.QtCore import Qt, QPointF
from PySide6.QtGui import QPainter
from PySide6.QtCharts import QChart, QChartView, QSplineSeries, QValueAxis
import sys
class ChartWindow(QChartView):
def __init__(self):
super().__init__()
chart = QChart()
series = QSplineSeries()
# 添加数据点到序列中
points = [(1, 5), (3, 7), (5, 6), (7, 6), (9, 2)]
for point in points:
series.append(point[0], point[1])
axisX = QValueAxis()
axisY = QValueAxis()
chart.addSeries(series)
chart.setAxisX(axisX, series)
chart.setAxisY(axisY, series)
self.chart = chart
self.series = series
self.setCursorVisible(False) # 默认隐藏光标线
self.setVerticalCursorLine(None) # 初始化时清除任何可能存在的旧线条
self.setRenderHint(QPainter.Antialiasing)
self.setChart(chart)
def main():
app = QApplication(sys.argv)
window = ChartWindow()
window.resize(800, 600)
window.show()
sys.exit(app.exec())
```
#### 处理鼠标移动事件绘制垂线
重写 `mouseMoveEvent()` 方法以响应用户的鼠标动作,并根据当前鼠标的横坐标计算对应的纵坐标值,从而动态更新显示的垂直辅助线的位置。
```python
def mouseMoveEvent(self, event):
pos = event.pos()
scenePos = self.mapToScene(pos)
x_value = round(scenePos.x(), 2)
y_values = []
for i in range(len(self.series.pointsVector())):
p = self.series.at(i).position()
if abs(p.x() - x_value) < 0.5: # 找最近的数据点
y_values.append((p.y()))
avg_y = sum(y_values)/len(y_values) if len(y_values)>0 else None
self.setVerticalCursorLine(x_value, avg_y or None)
super().mouseMoveEvent(event)
def setVerticalCursorLine(self, x=None, y=None):
"""Draw vertical cursor line at given position."""
pen = QtGui.QPen(QtCore.Qt.red)
pen.setWidthF(1.)
old_line = getattr(self, '_vertical_cursor', None)
if old_line is not None and isinstance(old_line, QGraphicsLineItem):
self.scene().removeItem(old_line)
if x is not None and y is not None:
height = self.height()
top_point = QtCore.QPointF(x, 0.)
bottom_point = QtCore.QPointF(x, float(height))
new_line = QtWidgets.QGraphicsLineItem(
QtCore.QLineF(top_point, bottom_point))
new_line.setPen(pen)
self.scene().addItem(new_line)
setattr(self, '_vertical_cursor', new_line)
elif hasattr(self, '_vertical_cursor'):
delattr(self, '_vertical_cursor')
```
此代码片段实现了当用户将鼠标悬停于图表之上时会自动显示出一条红色虚线作为参考指引,帮助查看特定时刻下的函数取值情况[^1]。
阅读全文
相关推荐


















