2012-06-18 3 views
0

Название более или менее говорит обо всем. Я создаю виджет, добавляю его в QTabWidget, и когда я переключаюсь на новую вкладку, приложение падает.Qt App Crashing после добавления вкладки в 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 

preferencestab.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 
} 

Если я удаляю линию, где она разбилась, ей удаётся создать новую вкладку, но она падает, когда я человек переключитесь на него.

Это должно быть что-то глупое, но я просто не могу найти ошибку. Help Please

+0

Что ваш отладчик говорит о том, что происходит на этой линии? – cmannett85

+0

@ cbamber85 Только «Программа неожиданно закончила», Qt как-то управляет ошибками, и она просто закрывается. Но я думаю, что что-то подобное произошло с ними раньше, когда пытались использовать метод объекта, который, как я думал, был указан указателем, но на самом деле это нулевой указатель. – Topo

+1

@Topo Это звучит так, будто вы не отлаживаете. В QtCreator вы запускаете режим отладки, нажимая F5 вместо Ctrl-R. С помощью «вашего отладчика» cbamber85 не означал QtCreator, а сам GDB. Это отладчик, который запускается QtCreator в режиме отладки и сообщает QtCreator (который затем говорит вам), какая ошибка произошла. Вы также можете установить точки останова, выполнить свой код и проверить значения переменных (до того, как, конечно, произойдет ошибка). Другой вариант - распечатать переменные с помощью qDebug. Кандидаты - это указатель 'this',' pref' и переменная 'index'; проверьте их значения. – leemes

ответ

3

Попробуйте отладить приложение.

В QtCreator вы запускаете режим отладки, нажимая F5 (⌘-Y на macs) вместо Ctrl-R. Это запустит отладчик (например, GDB), который сообщает QtCreator (который затем сообщает вам), какая ошибка произошла. Вы также можете установить точки останова, выполнить свой код и проверить значения переменных (до того, как, конечно, произойдет ошибка).

Другой вариант - распечатать переменные с помощью qDebug. Кандидатами являются указатель this, pref и переменная index; проверьте их значения.

Сказали, что проблема, которая вызывает сбой, скорее всего за пределами класса PreferencesTab, возможно, даже вне класса TabManager. То, что код внутри метода класса выполняется, не означает, что это был «действительный» вызов (= указатель this был действителен). Поэтому проверка указателя this всегда является хорошей идеей для отслеживания вызовов нулевых или недействительных указателей.

Если TabManager является QObject, даже отладка this указателя потерпит неудачу (если он является недействительным), потому что qDebug() << this запросит metaObject(), который будет (скорее всего) недопустимое чтение, если this указателя является недействительным.

Смежные вопросы