我在Qt中创建一个C ++应用程序,并且每当我调用相应的ui-class的构造函数时都想加载一个登录键盘(QWidget)。每次切换到我的登录窗口时都会调用构造函数。当我离开这个窗口时,析构函数被调用,一切都被破坏了,所以我不会在RAM中留下一点。我还想要一个实例键盘(单例)然后在需要时隐藏()和show()。
当我第一次调用构造函数时,我创建了一个键盘实例并将其添加到我的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 :(得分:1)
当您添加LoggingKeyboard
的静态实例时,当布局被销毁时,它将被删除。
请参阅here
注意:项目的所有权转移到布局,布局的责任是删除它。
所以拥有QWidget的单例子类并不是一个好主意。如果确实需要单例属性 - 您可以将必要的功能提取到另一个类(不会是QWidget
的子类)并从LoginKeyboard
使用它。但是,如果你不真的需要它 - 那么就不要这样做 - 应该尽可能避免单身人士,因为他们只是全球变量的美化版本,可能会导致各种难以追踪的错误。