VS中的VTK和QT调试
VTK and QT debugging in VS
在经历了很多麻烦之后,我终于设法使用 Visual Studio 为 QT 设置了 VTK。设置是使用 cmake 完成的。
我使用的版本是:
- Visual Studio 2013
- Qt 5.6.2
- VTK 8.0.0
我的第一个目标是能够 运行 像 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
开头
在经历了很多麻烦之后,我终于设法使用 Visual Studio 为 QT 设置了 VTK。设置是使用 cmake 完成的。
我使用的版本是:
- Visual Studio 2013
- Qt 5.6.2
- VTK 8.0.0
我的第一个目标是能够 运行 像 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
开头