QGuiApplication破坏了不相关的代码

时间:2015-08-18 16:39:13

标签: qt vtk

我遇到了Memory corruption with libtorrent-rasterbar and QGuiApplication中描述的类似问题。

在我的情况下,vtk-reader(vtkPDBReader)在QGuiApplication app(argc, argv)之后调用时返回错误的值。该程序在64位Ubuntu系统上运行。

相关问题的答案对我没有帮助。据我所知,QGuiApplication以某种方式改变了系统执行其他功能的方式,但我不知道如何将其应用于我的问题。 谁能就如何解决这个问题给出更一般的答案? 我使用shared_libs选项构建VTK,并通过cmake完成链接。

谢谢。

这是一个最小的例子:

的CMakeLists.txt

cmake_minimum_required(VERSION 2.8.11)
file(GLOB_RECURSE SOURCES *.cpp)
file(GLOB_RECURSE HEADER *.h)

set(CMAKE_AUTOMOC ON)
FIND_PACKAGE(Qt5Widgets REQUIRED)
find_package(VTK REQUIRED)
if(VTK_LIBRARIES)
        include_directories(${VTK_INCLUDE_DIRS})
endif()

add_executable(test ${SOURCES} ${HEADER})

target_link_libraries(
    test
    ${VTK_LIBRARIES}
    ${Qt5Widgets_LIBRARIES}
)

的main.cpp

#include "qguiapplication.h"
#include "vtkPDBReader.h"
#include "vtkSmartPointer.h"
#include "vtkPolyData.h"
#include "vtkPointData.h"
#include "vtkPoints.h"

void load(){
    vtkSmartPointer<vtkPDBReader> pdb =
            vtkSmartPointer<vtkPDBReader>::New();
    std::string molFile = "PDBfile.pdb";
    pdb->SetFileName(molFile.c_str());
    pdb->Update();

    // prepare a vector that will contain xyz
    std::vector<float> atomPositions;
    atomPositions.clear();

    for(vtkIdType i = 0; i < pdb->GetOutput()->GetNumberOfPoints(); i++)
    {
        double p[3];
        p[0] = 0;
        p[1] = 0;
        p[2] = 0;
        pdb->GetOutput()->GetPoint(i, p);
        atomPositions.push_back(p[0]);
        atomPositions.push_back(p[1]);
        atomPositions.push_back(p[2]);
    }
}

int main(int argc, char *argv[]) {
    load(); // works fine
    QGuiApplication app(argc, argv);
    load(); // read data is corrupt
}

load()的第一次调用按预期工作。对于第二个调用,在QGuiApplication app(argc, argv);之后,p[0]包含转换为整数的预期值,p[1]始终设置为4.59163e-41且p[2]始终为0. / p>

0 个答案:

没有答案