vtkOBJReader在qt主循环中工作

时间:2015-11-02 13:39:31

标签: python c++ qt vtk

我在使用Python中的VTK读取OBJ文件时遇到了一个奇怪的问题。下面的代码示例对我来说很好。

reader = vtk.vtkOBJReader()
reader.SetFileName('cube.obj')
reader.Update()
inputP = reader.GetOutput()

app = QtGui.QApplication(sys.argv)

window = MainWindow(inputP)

sys.exit(app.exec_())

但如果我首先初始化 QApplication ,那么 vtkOBJReader 会抛出错误消息:

  

错误:在/build/vtk/src/VTK-6.1.0/IO/Geometry/vtkOBJReader.cxx,第192行   vtkOBJReader(0x56396fd14fa0):读取错误' v'在第5行

不起作用的示例代码如下所示:

app = QtGui.QApplication(sys.argv)

reader = vtk.vtkOBJReader()
reader.SetFileName('cube.obj')
reader.Update()
inputP = reader.GetOutput()

window = MainWindow(inputP)

sys.exit(app.exec_())

如果我用C ++编写这个程序,我会遇到同样的问题。 您有任何建议吗,如何强制 vtkOBJReader 在QT应用内部工作?

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题并且正在研究vtkObjectReader(链接:https://github.com/Kitware/VTK/blob/master/IO/Geometry/vtkOBJReader.cxx#L264)中的代码,您可以看到此代码段中生成的错误消息:

// this is a vertex definition, expect three floats, separated by whitespace:
if (sscanf(pLine, "%f %f %f", xyz, xyz+1, xyz+2) == 3)
  {
    points->InsertNextPoint(xyz);
    numPoints++;
  }
  else
  {
    vtkErrorMacro(<<"Error reading 'v' at line " << lineNr);
    everything_ok = false;
  }

问题是由于sscanf在qt初始化之前或之后调用它会产生不同的输出。 有了这些信息,我在这里找到了解决方案:Why does Qt change behaviour of sscanf()?

使用qt,用于解析该行的语言环境与您的系统相同(我的是意大利语,因此它期待&#34;,&#34;作为小数分频器而不是&#34;。&#34;所以它无法识别浮动类型。)

如果在定义QApplication之后更改了语言环境,它可以按预期工作,即:

QApplication a(argc, argv);
setlocale(LC_NUMERIC,"C");

答案 1 :(得分:0)

嗯,这可能对某人有所帮助。在初始化QtGui.QApplication(sys.argv)之前加载目标文件。