VS中的VTK和QT调试

VTK and QT debugging in VS

在经历了很多麻烦之后,我终于设法使用 Visual Studio 为 QT 设置了 VTK。设置是使用 cmake 完成的。

我使用的版本是:

我的第一个目标是能够 运行 像 this 这样的例子。

我能够 运行 在 VS 的发布模式下 运行 示例和其他示例,并正确 运行 可执行文件。

问题是,当我将其设置为调试模式时,我会以错误告终:

The program '[9520] SideBySideRenderWindowsQt.exe' has exited with code 1 (0x1).

经过几次尝试,我发现在调试模式下,每当创建 QVTKWidget 时:

QVTKWidget *qvtkWidgetLeft;
(...)
qvtkWidgetLeft = new QVTKWidget(centralwidget);

我收到上面的错误。

我已经在 QTcreator 中设置了一个调试器 post How to configure CDB in Qt Creator?

编辑:

调用栈如果有帮助的话:

>   SideBySideRenderWindowsQt.exe!QFlags<enum Qt::WindowType>::QFlags<enum Qt::WindowType>(int * __formal) Line 112 C++
    SideBySideRenderWindowsQt.exe!Ui_SideBySideRenderWindowsQt::setupUi(QMainWindow * SideBySideRenderWindowsQt) Line 72    C++
    SideBySideRenderWindowsQt.exe!SideBySideRenderWindowsQt::SideBySideRenderWindowsQt() Line 19    C++
    SideBySideRenderWindowsQt.exe!main(int argc, char * * argv) Line 9  C++

编辑 2:示例

此示例来自 QT GUI Application 类型的新项目 Visual Studio 2013

查看ui_QtGuiApplication.h

中的评论

main.cpp

#include "QtGuiApplication2.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtGuiApplication2 w;
    w.show();
    return a.exec();
}

QtGuiApplication2.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication2.h"

class QtGuiApplication2 : public QMainWindow
{
    Q_OBJECT

public:
    QtGuiApplication2(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtGuiApplication2Class ui;
};

QtGuiApplication2.cpp

#include "QtGuiApplication2.h"

QtGuiApplication2::QtGuiApplication2(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

ui_QtGuiApplication.h

此文件是通过Visual Studio使用QT Design后生成的:

#ifndef UI_QTGUIAPPLICATION2_H
#define UI_QTGUIAPPLICATION2_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_QtGuiApplication2Class
{
public:
    QWidget *centralWidget;
    QVTKWidget *qvtkWidget;   //Generated after adding VTK Widget
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *QtGuiApplication2Class)
    {
        if (QtGuiApplication2Class->objectName().isEmpty())
            QtGuiApplication2Class->setObjectName(QStringLiteral("QtGuiApplication2Class"));
        QtGuiApplication2Class->resize(600, 400);
        centralWidget = new QWidget(QtGuiApplication2Class);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));

        //THE LINES BELOW ARE GENERATED IF I 
        //ADD A VTK WIDGET FROM QT DESIGN:
        //In Debug mode, the first line returns:
        //The program '[15392] QtGuiApplication2.exe' has exited with code 1 (0x1).
        //In Release mode, the program works fine.
        qvtkWidget = new QVTKWidget(centralWidget);
        qvtkWidget->setObjectName(QStringLiteral("qvtkWidget"));
        qvtkWidget->setGeometry(QRect(200, 100, 100, 100));


        QtGuiApplication2Class->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(QtGuiApplication2Class);
        menuBar->setObjectName(QStringLiteral("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 600, 21));
        QtGuiApplication2Class->setMenuBar(menuBar);
        mainToolBar = new QToolBar(QtGuiApplication2Class);
        mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
        QtGuiApplication2Class->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(QtGuiApplication2Class);
        statusBar->setObjectName(QStringLiteral("statusBar"));
        QtGuiApplication2Class->setStatusBar(statusBar);

        retranslateUi(QtGuiApplication2Class);

        QMetaObject::connectSlotsByName(QtGuiApplication2Class);
    } // setupUi

    void retranslateUi(QMainWindow *QtGuiApplication2Class)
    {
        QtGuiApplication2Class->setWindowTitle(QApplication::translate("QtGuiApplication2Class", "QtGuiApplication2", 0));
    } // retranslateUi

};

namespace Ui {
    class QtGuiApplication2Class: public Ui_QtGuiApplication2Class {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_QTGUIAPPLICATION2_H

回答我自己的问题

因为我已经在 Debug 和 Release 模式下构建了 VTK,所以我认为这是正常的。

但我在输出中看到我的解决方案是从 ...\VTK\VTK-bin\bin\Release\ 获取 dll 文件,这些文件作为 PATH.

添加到环境变量中

我通过添加 ...\VTK\VTK-bin\bin\Debug\ 解决了这个问题。

在环境变量下PATH我知道有:

C:\VTK\VTK-bin\bin\Debug
C:\VTK\VTK-bin\bin\Release

由于Debug排在最前面,它现在会从这个文件夹中获取dll,我可以在调试模式下正确运行。 (Atm 如果我想在 Release 模式下构建,我需要切换这两个变量的顺序,所以仍然必须找到一个更好的解决方案来解决项目如何找到 dll。)

我遇到的另一个问题是一个新错误,它在此处描述: no override found for 'vtkPolyDataMapper' , 并且如解决方案中所述,它通过添加解决:

#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle)

在QVTKwidget.h

开头