gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:15 24 4
gpt4 key购买 nike

当使用 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" );
}

最佳答案

如果您的 label 超出范围,将调用析构函数 (QLabel::~QLabel)。来自docs :

Destroys the object, deleting all its child objects.

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

为什么你的程序可以工作——我不知道——它可能只是不工作(label 在作用域的末尾被销毁)。另一个问题是 - 如果您没有对它的引用,您将如何更改 label 的文本(例如,从某个插槽)?

编辑 我刚刚看到您的labelMainWindow 的成员。拥有一个完整的对象是非常好的,而不是将指向对象的指针作为类的成员,因为它不会在 MainWindow 之前被销毁。请注意,如果您像这样创建 MainWindow 的实例:

MainWindow *w = new MainWindow();

label 将在堆上创建。

关于C++ - 为什么要在堆上创建这些小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18984925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com