【问题标题】:VTK and QT debugging in VSVS中的VTK和QT调试
【发布时间】: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

ma​​in.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 写了什么?

标签: c++ qt vtk


【解决方案1】:

回答我自己的问题

因为我已经在调试和发布模式下构建了 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,我可以在调试模式下正确运行。 (如果我想在 Release 模式下构建,我需要切换这两个变量的顺序,所以仍然需要为项目如何找到 dll 找到更好的解决方案。)

发生在我身上的另一个问题是一个新错误,这里描述: no override found for 'vtkPolyDataMapper' , 并如解决方案中所述,通过添加:

#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle)

在 QVTKwidget.h 的开头

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2019-11-10
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多