2012-06-18 4 views
0

제목에 다소 차이가 있습니다. 위젯을 만들어 QTabWidget에 추가하고 새 탭으로 전환하면 앱이 다운됩니다.Qt 앱 QTab 위젯에 탭을 추가 한 후 크래시가 발생합니다.

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 
} 

내가 추락 한 행을 제거하면 새 탭을 만드는 데 성공하지만 사람이있을 때 충돌합니다. 그것으로 전환하십시오.

그것은 어리석은 뭔가 여야 만하지만 오류를 찾을 수 없습니다. 도와주세요

+0

디버거가 해당 행에서 어떤 일이 발생했는지에 대해 어떻게 말합니까? – cmannett85

+0

@ cbamber85 "프로그램이 예기치 않게 끝났습니다"만 Qt가 오류를 어떻게 든 관리하고 닫습니다. 그러나 나는 포인터와 같은 포인터가 가리키는 것으로 생각되는 객체의 메서드를 사용하려고 할 때 전에는 이런 일이 발생했다고 생각하지만 사실 null 포인터입니다. – Topo

+1

@Topo 디버깅을하지 않는 것 같습니다. QtCreator에서 Ctrl-R 대신 F5 키를 눌러 디버그 모드를 시작합니다. "디버거"를 사용하면 cbamber85가 QtCreator를 의미하는 것이 아니라 GDB 자체를 의미합니다. 이것은 디버그 모드에서 QtCreator에 의해 실행되는 디버거이며 어떤 종류의 오류가 발생했는지 QtCreator에 알려줍니다. 또한 중단 점을 설정하고 코드를 단계별로 실행하여 변수 값을 검사 할 수 있습니다 (물론 오류가 발생하기 전에). 또 다른 옵션은 qDebug를 사용하여 변수를 출력하는 것입니다. 후보는'this' 포인터,'pref'와'index' 변수입니다; 그들의 가치를 확인하십시오. – leemes

답변

3

응용 프로그램을 디버깅 해보십시오.

QtCreator에서 Ctrl-R 대신 F5 (Mac에서는 ⌘-Y) 키를 눌러 디버그 모드를 시작합니다. 이렇게하면 어떤 종류의 오류가 발생했는지 QtCreator에 알리는 디버거 (예 : GDB)가 시작됩니다. 또한 중단 점을 설정하고 코드를 단계별로 실행하여 변수 값을 검사 할 수 있습니다 (물론 오류가 발생하기 전에).

다른 옵션은 qDebug를 사용하여 변수를 인쇄하는 것입니다. 지원자는 this 포인터, prefindex 변수입니다. 그들의 가치를 확인하십시오.

그런데 충돌을 일으키는 문제는 PreferencesTab 클래스 외부에있을 가능성이 높으며, 심지어 TabManager 클래스 외부에서도 발생했을 가능성이 큽니다. 클래스의 메서드 내에서 코드가 실행되었다고해서 "유효한"호출 (= this 포인터가 유효 함)을 의미하지는 않습니다. 따라서 포인터를 검사하는 것은 항상 null 또는 잘못된 포인터에 대한 호출을 추적하는 것이 좋습니다. TabManager 만약

도 (이 유효하지 않은 경우) qDebug() << this는 (대부분) 될 metaObject() 요구할 것이기 때문에 this 포인터가 유효하지 않은 경우 this 포인터가 잘못된 읽기를 실패 디버깅하는 QObject입니다.

관련 문제