0

标题或多或少说明了一切。我创建了一个小部件,将其添加到 QTabWidget ,当我切换到新选项卡时,应用程序崩溃。

preferencestab.h(我要添加的小部件)

#ifndef PREFERENCESTAB_H
#define PREFERENCESTAB_H

#include <QWidget>

#include "tab.h"

class PreferencesTab : public QWidget
{
    Q_OBJECT
public:
    explicit PreferencesTab(QWidget *parent = 0);
    ~PreferencesTab();
    int num;

private:


private slots:
};

#endif // PREFERENCESTAB_H

首选项选项卡.cpp

#include "preferencestab.h"

#include <QDebug>

PreferencesTab::PreferencesTab(QWidget *parent) : QWidget(parent)
{
}

PreferencesTab::~PreferencesTab()
{

}

tabmanager.cpp (QTabWidget 的子类,我在其中添加新选项卡)

...
void TabManager::openPreferences()
{
    PreferencesTab *pref = new PreferencesTab();
    int index = this->addTab(pref, "Edit");

    this->setCurrentIndex(index); // It crashes on this line
}

如果我删除它崩溃的行,它会成功创建新选项卡,但是当我手动切换到它时会崩溃。

这一定是愚蠢的,但我找不到错误。请帮忙

4

1 回答 1

3

尝试调试您的应用程序。

在 QtCreator 中,您可以通过按 F5(Mac 上的⌘-Y)而不是 Ctrl-R 来启动调试模式。这将启动一个调试器(例如 GDB),它告诉 QtCreator(然后告诉你)发生了什么样的错误。您还可以设置断点,单步执行代码并检查变量值(当然是在错误发生之前)。

另一种选择是使用 qDebug 打印出变量。候选者是this指针prefindex变量;检查它们的值。

也就是说,导致崩溃的问题很可能在PreferencesTab课堂之外,甚至可能在课堂之外TabManager。执行类方法中的代码并不意味着这是一个“有效”调用(=this指针有效)。因此,检查this指针始终是跟踪对空指针或无效指针的调用的好主意。

如果TabManager是 a QObject,即使调试this指针也会失败(如果它无效),因为qDebug() << this会要求 ,metaObject()如果指针无效,这将(很可能)是无效读取this

于 2012-06-18T09:23:57.377 回答