1

I'm trying to Draw VTK ChartXY using QVTKRenderWindowInteractor because my program is designed to use PyQt. Problem is, showing chart is good but, i can't interact with the chart for example, zoom, pan, hovering. When i tested identical chart show task without QVTKRenderWindowInteractor, then interact event was perfect.


Here is my reference Code.

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_())

This example show Pure VTK window and after closing VTK window show QtWidget window. The Pure VTK window interact perfectly with my commant, QtWidget interact not at all.

Is anybody know how to make VTK chart interact well with PyQt system?? Thanks.

prody
  • 194
  • 1
  • 11
minsu
  • 81
  • 5

1 Answers1

1

Here is my own answer. VTKRenderWindowInteractor should get parameter manually iren, rw.

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

then i could interact with my chart with Qt system well.


here is better and precise solution from VTK community.

You need just simply set RenderWindow.

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

minsu
  • 81
  • 5