使用 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(使用前将#替换为@)