2015-10-18 4 views
0

Я делаю приложение C++ в Qt и хочу загрузить клавиатуру входа (QWidget) всякий раз, когда я вызываю конструктор соответствующего ui-класса. Конструктор вызывается каждый раз, когда я переключаюсь в свое окно входа в систему. Когда я покидаю это окно, деструктор вызывается и все уничтожается, поэтому я не оставляю ни одного бита в своей ОЗУ. Я хочу также просто иметь один экземпляр клавиатуры (singleton), а затем скрыть() и показать(), когда это необходимо.Почему мой статический указатель недоступен

Когда я вызываю конструктор в первый раз, я создаю экземпляр моей клавиатуры и добавляю его в свой 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 - вы можете извлечь необходимую функциональность для другого класса (который не будет подклассифицироваться QWidget) и использовать его от LoginKeyboard. Однако, если вы не делаете действительно это нужно - тогда просто не делайте этого - следует избегать одиночных игр, поскольку они просто прославленные версии глобальных переменных и могут вызывать большое разнообразие труднодоступных путей ошибок.

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