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
我在 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