2015-10-18 82 views
0

我正在Qt中創建一個C++應用程序,並且只要我調用相應的ui-class的構造函數就要加載登錄鍵盤(QWidget)。每次切換到我的登錄窗口時都會調用構造函數。當我離開這個窗口時,析構函數被調用並且一切都被銷燬,所以我不會在我的RAM中留下一點點。我想也只是有一個實例的鍵盤(單身人士),然後隱藏()和顯示(),只要需要。爲什麼我的靜態指針不可訪問

當我第一次調用構造函數時,我創建了我的鍵盤實例並將其添加到verticalLayout。這工作正常。但是當我第二次調用構造函數時,例如當我切換到另一個窗口並切換回我的登錄窗口時,我的靜態鍵盤變得無法訪問。這是我的調試器說的...它無法訪問。所以我已經有了我的鍵盤的一個實例,我只是想再次將其添加到我的verticalLayout,我不明白爲什麼我無法訪問它。也許這是靜態變量的一些屬性,我真的不喜歡C++的新特性。因此,這裏是我的代碼

#ifndef LOGINKEYBOARD_H 
#define LOGINKEYBOARD_H 

#include <QWidget> 

namespace Ui 
{ 
    class LoginKeyboard; 
} 

class LoginKeyboard : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit LoginKeyboard(QWidget *parent = 0); 
    ~LoginKeyboard(); 

    static LoginKeyboard * instance() 
    { 
    if (!loginKeyboard) 
    { 
     loginKeyboard = new LoginKeyboard(); 
    } 

    return loginKeyboard; 
    } 

private: 
    Ui::LoginKeyboard *ui; 
    static LoginKeyboard * loginKeyboard; 

private slots: 



}; 

#endif // LOGINKEYBOARD_H 

#include "headerFiles/loginkeyboard.h" 
#include "ui_loginkeyboard.h" 

LoginKeyboard *LoginKeyboard::loginKeyboard = 0; 

LoginKeyboard::LoginKeyboard(QWidget *parent) : QWidget(parent), ui(new Ui::LoginKeyboard) 
{ 
    ui->setupUi(this); 
} 

LoginKeyboard::~LoginKeyboard() 
{ 
    delete ui; 
} 


#include "headerFiles/support.h" 
#include "ui_support.h" 
#include "headerFiles/mainwindow.h" 
#include "headerFiles/loginkeyboard.h" 

Support::Support(QWidget *parent) : QWidget(parent), ui(new Ui::Support) 
{ 
    ui->setupUi(this);  
    MainWindow::setPreviousPage(MainWindow::widgetStack->first()); 
    ui->verticalLayout->addWidget(LoginKeyboard::instance()); //error when it gets called the 2nd time 
} 

Support::~Support() 
{ 
    delete ui; 
} 
+0

'ui-> verticalLayout-> addWidget'需要一個分配的指針,這樣當'ui'被銷燬時,它會刪除添加的小部件(您的實例)? – 1201ProgramAlarm

回答

1

當您添加的LoggingKeyboard它會被它當佈局被破壞被刪除您的靜態實例。

here

注:項目的所有權轉移到佈局,這是佈局的責任,將其刪除。

因此,擁有QWidget的singleton子類並不是一個好主意。如果你確實需要singleton屬性 - 你可以將必要的功能提取到不同的類(它不會繼承QWidget)並使用它從LoginKeyboard。但是,如果你不需要需要它 - 那麼就不要這樣做 - 單身人士應該儘可能避免,因爲他們只是全球變量的優化版本,可能會導致各種各樣的難以追蹤錯誤。

相關問題