vtkOBJReader 在 qt 主循环中不起作用

vtkOBJReader dosen't work inside qt main loop

我在 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 会抛出一条错误消息:

ERROR: In /build/vtk/src/VTK-6.1.0/IO/Geometry/vtkOBJReader.cxx, line 192 vtkOBJReader (0x56396fd14fa0): Error reading 'v' at line 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 应用程序中工作?

好吧,它可能会对某人有所帮助。在初始化 QtGui.QApplication(sys.argv).

之前加载对象文件

我遇到了完全相同的问题并研究了 vtkObjectReader (link: 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;
  }

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

使用 qt 时,用于解析该行的语言环境与您的系统相同(我的语言环境是意大利语,所以它期望“,”作为十进制分隔符而不是“。”,所以它无法识别浮点类型)。

如果您在定义 QApplication 后更改语言环境,它会按预期工作,即:

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

在python中,这个问题可以通过在定义你的QApplication后改变locale来解决:

app = QApplication(sys.argv)
locale.setlocale(locale.LC_NUMERIC, 'C')
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())

此资源可能对您有所帮助:https://docs.python.org/2/library/locale.html