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 では、Ctrl-R の代わりに F5 (Mac では ⌘-Y) を押してデバッグ モードを開始します。これによりデバッガー (GDB など) が起動し、QtCreator にどのようなエラーが発生したかが通知されます。また、ブレークポイントを設定し、コードをステップ実行して、変数値を検査することもできます (もちろんエラーが発生する前に)。

別のオプションは、qDebug を使用して変数を出力することです。候補はthisポインターprefindex変数です。それらの値を確認してください。

とはいえ、クラッシュの原因となる問題はクラス外にある可能性が高く、PreferencesTabクラス外にある可能性もありTabManagerます。thisクラスのメソッド内のコードが実行されるということは、それが「有効な」呼び出しであった (=ポインターが有効であった)ことを意味するわけではありません。thisそのため、ヌルまたは無効なポインターへの呼び出しを追跡するには、常にポインターをチェックすることをお勧めします。

TabManagerが の場合QObject、ポインタのデバッグもthis失敗します (無効な場合)。これは、qDebug() << thisが を要求するためです。ポインタが無効なmetaObject()場合、これは (ほとんどの場合) 無効な読み取りになります。this

于 2012-06-18T09:23:57.377 に答える