2015-10-18 47 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。但是,如果你不需要需要它 - 那么就不要这样做 - 单身人士应该尽可能避免,因为他们只是全球变量的优化版本,可能会导致各种各样的难以追踪错误。

相关问题