2012-06-18 93 views
0

標題或多或少地說明了一切。我創建一個小部件,將其添加到QTabWidget,當我切換到新的選項卡時,應用程序崩潰。Qt應用程序在向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 
} 

如果我刪除它墜毀的那一行,它會成功創建新的選項卡,但會在我登錄時崩潰ually切換到它。

它一定是愚蠢的,但我找不到錯誤。幫助請

+0

您的調試器對此行發生了什麼說? – cmannett85

+0

@ cbamber85只有「程序意外完成」,Qt以某種方式管理錯誤,它只是關閉。但是當我嘗試使用一個我認爲是由指針指向的對象的方法時,我認爲像這樣的事情發生在時間之前,但事實上它是一個空指針。 – Topo

+1

@頂部這聽起來像你沒有調試。在QtCreator中,通過按F5而不是Ctrl-R來啓動調試模式。用「你的調試器」,cbamber85並不意味着QtCreator,而是GDB本身。這是一個調試器,由QtCreator在調試模式下運行,並告訴QtCreator(然後告訴你)發生了什麼樣的錯誤。您還可以設置斷點,逐步執行代碼並檢查變量值(當然,發生錯誤之前)。另一個選擇是使用qDebug打印出變量。候選人是'this'指針,'pref'和'index'變量;檢查它們的值。 – leemes

回答

3

嘗試調試您的應用程序。

在QtCreator中,通過按下F5(mac上的⌘-Y)而不是Ctrl-R來啓動調試模式。這將啓動一個調試器(例如GDB),它告訴QtCreator(然後告訴你)發生了什麼樣的錯誤。您還可以設置斷點,逐步執行代碼並檢查變量值(當然,發生錯誤之前)。

另一種選擇是使用qDebug打印出變量。候選人是this指針,prefindex變量;檢查它們的值。

也就是說,引起碰撞的問題最有可能在PreferencesTab類之外,甚至可能在TabManager類之外。一個類的方法內的代碼被執行並不意味着這是一個「有效的」調用(= this指針是有效的)。因此,檢查this指針始終是一個好主意,可以跟蹤對空指針或無效指針的調用。

如果TabManagerQObject,即使調試如果this指針是無效的this指針會失敗(如果它是無效的),因爲qDebug() << this會詢問metaObject(),這將是(最有可能)無效讀取。

相關問題