我需要得到一個vtkChartParallelCoordinates和其他使用與PyQt應用程序並行運行的vtkContextView的圖。問題在於它們都使用用戶鼠標交互的無限循環,並且我一次只能運行其中的一個。當我通過view.GetInteractor()啓動vtk交互器時,Start()在關閉vtk窗口之前不會顯示PyQt應用程序。 我想,我對如何做兩種選擇:VTK交互器和PyQt並行運行
- 照顧VTK對象的用戶交互的PyQt的的循環手動
- 渲染PyQt的應用
關於第二個選項:我不能使用QVTKRenderWindowInteractor,它似乎不能使用vtkContextView圖形。我發現Kitware的一個文檔: http://www.na-mic.org/Wiki/images/1/18/NA-MIC-VTK-Charts-2011.pdf 在第22頁他們使用QVTKWidget但我的編譯vtk沒有它。
我試圖做一些關於選項1沒有成功,沒有相關的例子可用。
在我的代碼下面,當我註釋掉「view.GetInteractor().Start()」時,PyQt窗口顯示並且是交互式的。
我在linux上使用Python 2.7.11版本,vtk版本7.0.0。
我會感謝任何幫助!
from PyQt4 import QtCore, QtGui
import vtk
import math
class Ui_widgetParallel(object):
def setupUi(self, widgetParallel):
widgetParallel.setObjectName("widgetParallel")
widgetParallel.resize(802, 651)
#button
self.button = QtGui.QPushButton(widgetParallel)
self.button.setGeometry(QtCore.QRect(180, 100, 75, 23))
self.button.setText("Click on me")
QtCore.QMetaObject.connectSlotsByName(widgetParallel)
self.button.clicked.connect(self.testClick)
def testClick(self):
print('I was clicked on')
def selectionCallback(caller, event):
#executes when new data is selected by the user
#prints row numbers of all selected data rows
annSel = annotationLink.GetCurrentSelection()
if annSel.GetNumberOfNodes() > 0:
idxArr = annSel.GetNode(0).GetSelectionList()
if idxArr.GetNumberOfTuples() > 0:
for ii in range(idxArr.GetNumberOfTuples()):
print(idxArr.GetValue(ii))
if __name__ == "__main__":
import sys
############################
# CREATE A DATA TABLE
############################
arrX = vtk.vtkFloatArray()
arrX.SetName("XAxis")
arrC = vtk.vtkFloatArray()
arrC.SetName("Cosine")
arrS = vtk.vtkFloatArray()
arrS.SetName("Sine")
arrS2 = vtk.vtkFloatArray()
arrS2.SetName("Tan")
numPoints = 20
inc = 0.2/(numPoints-1)
for i in range(numPoints):
arrX.InsertNextValue(i * inc)
arrC.InsertNextValue(math.cos(i * inc) + 0.0)
arrS.InsertNextValue(math.sin(i * inc) + 0.0)
arrS2.InsertNextValue(math.tan(i * inc) + 0.5)
table = vtk.vtkTable()
table.AddColumn(arrX)
table.AddColumn(arrC)
table.AddColumn(arrS)
table.AddColumn(arrS2)
############################
# STARTS THE QtGui application
############################
app = QtGui.QApplication(sys.argv)
widgetParallel = QtGui.QWidget()
ui = Ui_widgetParallel()
ui.setupUi(widgetParallel)
widgetParallel.show()
############################
# PARALLEL COORDINATES VIEW AND ANNOTATION
############################
#render contextView and parallel coordinates view
view = vtk.vtkContextView()
view.GetRenderer().SetBackground(1.0, 1.0, 1.0)
view.GetRenderWindow().SetSize(600,300)
chart = vtk.vtkChartParallelCoordinates()
view.GetScene().AddItem(chart)
# Create a annotation link to access selection in parallel coordinates view
annotationLink = vtk.vtkAnnotationLink()
annotationLink.GetCurrentSelection().GetNode(0).SetFieldType(1) # Point
annotationLink.GetCurrentSelection().GetNode(0).SetContentType(4) # 1 = GlobalIds, 2 = PedigreeIds, 4 = Indices
chart.SetAnnotationLink(annotationLink)
annotationLink.AddObserver("AnnotationChangedEvent", selectionCallback)
#link input data and refresh attributes view
chart.GetPlot(0).SetInputData(table)
chart.GetPlot(0).SetScalarVisibility(1)
chart.GetPlot(0).SetScalarVisibility(1)
chart.GetPlot(0).SetWidth(5)
chart.GetPlot(0).SetOpacity(0)
#render view
view.ResetCamera()
view.GetRenderWindow().SetMultiSamples(0)
view.Render()
view.GetInteractor().Start()
############################
# EXITS THE APPLICATION WHEN GUI LOOP IS CLOSED
############################
sys.exit(app.exec_())
這正是我所期待的,非常感謝! – Kubik