C++ - 为什么我要在堆上创建这些小部件?

2023-11-22

使用 C++ 和 Qt 创建 GUI 时,您可以创建一个标签,如下所示:

QLabel* label = new QLabel("Hey you!", centralWidgetParent);

这会在堆上创建对象,并将一直保留在那里,直到我手动删除它或父对象被销毁。我现在的问题是为什么我需要一个指针?为什么不在堆栈上创建它?

//Create a member variable of Class MainWindow
QLabel label;

//Set parent to show it and give a text so the user can see it
    QWidget* centralWidget = new QWidget(this); //Needed to add widgets to the window
    this->setCentralWidget( centralWidget ); 
    label.setParent(centralWidget);
    label.setText( "Haha" );

这工作正常,我可以看到标签并且它没有消失。

我们在 C++ 中使用指针来让某些东西活得更久,这样我们就可以在不同的作用域中使用一个对象。但是当我创建一个成员变量时,它不会一直保留到对象被销毁吗?

编辑: 也许是我说得不够清楚。这是主窗口类:

class MainWindow : public QMainWindow
{
    Q_OBJECT
    QLabel label; //First introduced here...

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

//Constructor
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget* centralWidget = new QWidget(this);
    this->setCentralWidget( centralWidget );
    label.setParent(centralWidget);
    label.setText( "Haha" );
}

If your label超出范围,析构函数(QLabel::~QLabel)将被调用。来自docs:

销毁对象,删除其所有子对象。

没有必要在堆上创建对象 - 您可以将对象放在堆栈上,但是您需要对对象的生命周期负责(在堆上分配数据的最有问题的问题之一是“谁以及何时应该删除这些对象?”,在 Qt 中,它由层次结构处理 - 每当您删除小部件时,所有子小部件都将被删除)。

为什么你的程序有效 - 我不知道 - 它可能只是不起作用(label在范围结束时被销毁)。另一个问题是 - 您将如何更改文本label(例如,来自某个插槽)如果您没有对其的引用?

Edit我刚刚看到你的label是的成员MainWindow。拥有一个完整的对象,而不是指向对象的指针作为类的成员,这是完全可以的,因为它之前不会被销毁MainWindow是。请注意,如果您创建您的实例MainWindow像这样:

MainWindow *w = new MainWindow();

label将在堆上创建。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ - 为什么我要在堆上创建这些小部件? 的相关文章

随机推荐