首页 > 解决方案 > VTK Chart 与 PyQt 交互的问题

问题描述

我正在尝试使用绘图VTK ChartXYQVTKRenderWindowInteractor因为我的程序旨在使用PyQt. 问题是,显示图表很好,但我can't interact使用图表,例如缩放、平移、悬停。当我在没有 QVTKRenderWindowInteractor 的情况下测试相同的图表显示任务时,交互事件是完美的。


这是我的参考代码。

from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5.QtWidgets import QVBoxLayout, QWidget, QApplication, QPushButton
import matplotlib.pyplot as plt
import numpy as np
import vtk
import math
import sys
import os

app = QApplication(sys.argv)

widget = QVTKRenderWindowInteractor()
widget.Initialize()
widget.Start()

view = vtk.vtkContextView()
view.GetRenderer().SetBackground(1.0, 1.0, 1.0)
view.GetRenderWindow().SetSize(400, 300)

chart = vtk.vtkChartXY()
view.GetScene().AddItem(chart)
chart.SetShowLegend(True)

table = vtk.vtkTable()

arrX = vtk.vtkFloatArray()
arrX.SetName('X Axis')

arrC = vtk.vtkFloatArray()
arrC.SetName('Cosine')

arrS = vtk.vtkFloatArray()
arrS.SetName('Sine')

arrT = vtk.vtkFloatArray()
arrT.SetName('Sine-Cosine')

table.AddColumn(arrC)
table.AddColumn(arrS)
table.AddColumn(arrX)
table.AddColumn(arrT)

numPoints = 40

inc = 7.5 / (numPoints - 1)
table.SetNumberOfRows(numPoints)
for i in range(numPoints):
    table.SetValue(i, 0, i * inc)
    table.SetValue(i, 1, math.cos(i * inc))
    table.SetValue(i, 2, math.sin(i * inc))
    table.SetValue(i, 3, math.sin(i * inc) - math.cos(i * inc))

points = chart.AddPlot(vtk.vtkChart.POINTS)
points.SetInputData(table, 0, 1)
points.SetColor(0, 0, 0, 255)
points.SetWidth(1.0)
points.SetMarkerStyle(vtk.vtkPlotPoints.CROSS)

view.GetRenderWindow().SetMultiSamples(0)
view.GetInteractor().Initialize()
view.GetInteractor().Start()

widget.GetRenderWindow().AddRenderer(view.GetRenderer())
widget.setWindowTitle('Qt Widget')
widget.show()

exit(app.exec_())

此示例显示Pure VTK window并在关闭 VTK 窗口后显示QtWidget window。Pure VTK 窗口与我的命令完美交互,QtWidget 完全不交互。

有人知道如何使 VTK 图表与 PyQt 系统很好地交互吗?谢谢。

标签: pyqt5vtkqvtkwidget

解决方案


这是我自己的答案。VTKRenderWindowInteractor 应该手动获取参数irenrw

view = vtk.vtkContextView()
widget = VTKRenderWindowInteractor(iren=view.GetInteractor(), rw=view.GetRenderWindow())

然后我可以用 Qt 系统很好地与我的图表交互。


这是来自 VTK 社区的更好更精确的解决方案。

您只需简单地设置 RenderWindow。

https://discourse.vtk.org/t/problem-with-vtk-chart-interaction-with-pyqt/6561?u=hhebb


推荐阅读