【发布时间】:2017-06-27 14:33:02
【问题描述】:
经过很多麻烦后,我终于设法使用 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 中设置了一个调试器,遵循这篇文章 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:示例
这个例子来自于在 Visual Studio 2013 中生成一个类型为 QT GUI Application 的新项目
查看ui_QtGuiApplication.h中的cmets
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
【问题讨论】:
-
如果您在 Visual Studio 中设置项目,为什么要使用 QtCreator 进行调试?使用 Visual Studio 调试器。当它崩溃时检查调用堆栈。似乎某处的指针无效,但从您的帖子中我无法确认。
-
我不想用 QT creator 调试。在寻找解决方案后,我想我必须在 qtcreator 中设置一个调试器才能从 VS 正确调试。我可能错了。但无论如何我运行默认的 VS 调试器。我会检查调用堆栈的内容。
-
如果您使用 Visual Studio,Qt Creator 设置确实无关紧要。发布堆栈可能会有所帮助。
-
谢谢。完成。
-
程序在
QVTKWidget的构造函数中不会崩溃。第 72 行的setupUi写了什么?